Отступление 2. Сокращение избыточной информации

Хранение одинаковой (повторяющейся) информации в разных строках таблицы неоправданно. Например, в нашем случае повторяется информация про языки программирования. Для устранения такой избыточности принято поступать так: создают отдельную таблицу для хранения повторяющейся информации (в нашем случае языки программирования), а в основной таблице вместо повторяющейся информации (названия языков программирования) размещаются только порядковые номера её расположения во вспомогательной таблице. Рассмотрим этот приём на примере.

Откройте нашу базу данных mkl.mdb в Microsoft Access. В ней пока существует только одна таблица. В конструкторе базы данных нажмите Создать и укажите Режим Конструктора.

Далее определите два поля в таблице: id_lang – идентификатор языка и язык – название языка программирования.

Поле id_lang назначьте ключевым и сохраните таблицу, дав ей имя языки. В конструкторе базы данных станет доступной еще одна таблица – языки. Давайте её отредактируем, а точнее добавим названия языков программирования.

Кликните дважды в конструкторе базы данных по имени таблицы. У вас откроется таблица в режиме редактирования. Поле id_lang заполняется автоматически при добавлении новой записи так как мы установили его как Счетчик, а поле язык заполните сами по образцу

В таблице магазин тоже необходимо сделать изменения: удалите содержимое поля язык программирования во всех строках и через конструктор смените тип данных этого поля на числовой.

Теперь следует внести изменения в структуру приложения, так как формат полей таблицы изменился.

Кликните дважды на компонент TableMagazin и в окне настройки полей таблицы удалите поле язык программирования и добавьте его снова, затем активизируйте компонент TableMagazin. Всё – изменения вступили в силу, можно посмотреть на результат.

Пока поля для языка программирования заполним соответствующими цифрами, что несколько неудобно. Но в дальнейшем мы разработаем и оформим интерфейса пользователя, что избавит от необходимости подсматривать в таблицу языки.

Эффект сокращения избыточности информации пока не заметен и, возможно, малопонятен. Мы из одной таблицы сделали две. При увеличении числа книг будет расти только первая таблица, вторая будет оставаться без изменений. В первой таблице вместо названий языков будут стоять цифры (ссылки на строки таблицы языки). Но мы организуем так, чтобы пользователь мог видеть содержимое этих двух таблиц в удобной для себя форме.

Один из подходов основан на использовании языка SQL, который позволяет делать выборку из нескольких таблиц в одну. Рассмотрим пример.

Давайте для сравнения разместим такую объединенную таблицу прямо на главной форме – разместите на форме компонент DBGrid2, а в форме Модуля Данных компоненты ADOQuery1 (переименуйте в QueryOtbor) и DataSource3. QueryOtbor свяжите с ADOConnection1, DataSource3 с QueryOtbor, а DBGrid2 с DataSource3.

После того как все компоненты связаны можно определиться с запросом к базе данных, состоящей из двух таблиц. Для этого не обязательно знать язык SQL – достаточно грамотно воспользоваться возможностями Microsoft Access, в котором есть конструктор запросов.

Переходим в Microsoft Access, закрываем все открытые таблицы и в конструкторе базы данных нажимаем на кнопку Запросы, далее выбираем опцию Создание запроса в режиме конструктора – возникает окно добавления таблиц. Добавляем обе таблицы и закрываем это окно.

Установим связь между таблицами по полю язык программирования из таблицы магазин и по полю id_lang из таблицы языки. Для чего нажмем левой клавишей мыши на поле язык программирования в таблице магазин и удерживая его перенесем на поле id_lang из таблицы языки.

В конструкторе запроса (см. рис. ниже):

– в первом столбце выбираем Имя таблицы – магазин, а Поле – название;

– во втором столбце выбираем Имя таблицы – магазин, а Поле – автор;

– в третьем столбце выбираем Имя таблицы – языки, а Поле – язык.

На этом формирование запроса закончено. Можно его апробировать, выбрав в меню Запрос / Запуск – на что получите искомый результат. Но нас интересует не сколько результат, сколько текст запроса на языке SQL. Его можно просмотреть и скопировать выбрав в меню Вид / Режим SQL. Скопируйте весь текст запроса:

SELECT магазин.название, магазин.автор, языки.язык

FROM магазин INNER JOIN языки ON магазин.[язык программирования] = языки.id_lang

и вставьте его в свойство SQL компонента QueryMagazin. Активизируйте компонент (свойство Active=True). Результат можно увидеть в компоненте DBGrid2.

Рассмотрим кратко текст запроса. В первой строке после ключевого слова SELECT перечислены поля, которые будут отбираться из соответствующих таблиц. Во второй строке указано что данные берутся из (FROM) таблицы магазин и объединяются с таблицей языки, но выбираются только те строки, для которых истинно условие – магазин.[язык программирования] = языки.id_lang.

Итак, даже не зная языка SQL, используя конструктор запросов Microsoft Access, можно сформировать запрос различной сложности. Попробуйте сами добавить в текст запроса сортировку по полю автор по убыванию.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: