Очень важно научиться устанавливать связи между таблицами, что позволяет выполнять нормализацию БД. Давайте добавим в нашу БД по DVD-дискам информацию о том, какая кинокомпания сняла тот или иной фильм. Если просто добавить в таблицу dvd.db текстовое поле, то названия компаний в нем будут повторяться, что означает нарушение принципов нормализации БД. Следовательно, список кинокомпаний нужно вынести в отдельную таблицу comp.db, а в таблице dvd.db оставить поле типа Long Integer, в котором будут храниться числа – ссылки на строки таблицы comp.db (Рис. 28.1).
dvd.db – главная таблица
|
| comp.db – подчиненная таблица
|
Имя поля
| Тип данных
|
| Имя поля
| Тип данных
|
ID
| автоинкремент
|
| ID
| автоинкремент
|
NAME_RUSSIAN
| текст
|
| NAME
| текст
|
NAME_ENGLISH
| текст
|
|
|
|
NUMBER
| целое число
|
|
|
|
SUBTITLES
| булевский
|
|
|
|
YEARF
| целое число
|
|
|
|
COMPANY
| длинное целое
|
|
|
|
Рис. 32.1 Структуры главной и подчиненной таблиц.
Под ссылкой понимается значение, хранящееся в автоинкрементном поле ID подчиненной таблицы.
Откройте таблицу dvd.db в программе Database Desktop и измените ее структуру, щелкнув по кнопке Restructure. Добавьте поле COMPANY с типом данных Long Integer и сохраните изменения. При помощи той же программы создайте новую таблицу comp.db с полями ID (автоинкремент) и NAME (текст, 250 символов). Не забудьте изменить язык таблицы! Сохраните таблицу в той же директории, что и таблицу dvd.db. В созданную таблицу comp.db добавьте несколько записей с названиями кинокомпаний, а поле COMPANY таблицы dvd.db для всех записей пока занесите значение 1.
Вернитесь в Delphi. В модуль данных добавьте компонент Query, назвав его comp. Установите его свойства Active, DatabaseName, SessionName, RequestLive в те же значения, что и у компонента DVD. В свойство SQLзанесите выражение SELECT * FROM comp.
Разумеется, добавленный запрос надо открывать в начале работы программы, причем обязательно с соблюдением простого правила: все подчиненные таблицы открываются до открытия главной таблицы. Поэтому в обработчик события модуля данных OnCreate добавим следующий код (новые строки выделены жирным шрифтом):
// открываем таблицу comp.db