Создание таблиц базы данных
Лабораторная работа № 3
Создание локального приложения БД средствами Delphi (20 баллов)
Содержание работы
1. Создание таблиц (файлов) с помощью программы Database Desktop, определение связи и ссылочной целостности.
2. Создание модуля данных; главной формы, имеющей меню с выходом на формы просмотра и корректировки всех таблиц и на формы вывода выходных документов в Delphi. Предусмотреть выдачу сообщения об ошибках при неправильном вводе данных. В для работы со страницей QReport в Delphi 7 следует инсталлировать пакет dclqrt70.bpl (component/install package, кнопка Add – выбрать указанный пакет из каталога BIN Delphi 7).
3. Наполнение таблиц данными, достаточными для вывода выходных документов.
4. Защита работы.
Будем иллюстрировать разработку следующим примером.
Пусть требуется хранить информацию об учителях (ФИО учителя), предметах (название предмета), классах (название класса) и учениках (ФИО ученика, средний балл).
Учитель может преподавать несколько предметов, предмет может вестись несколькими учителями. Для каждого учителя следует указывать нагрузку (количество часов, затрачиваемое на предмет в неделю) по каждому предмету.
ВНИМАНИЕ! Для каждой таблицы создается дополнительное поле, являющееся ключевым (num_Название таблицы), которое будет хранить внтуренний код записи – ее порядковый номер, недоступный пользователю. Это поле будет генерироваться автоматически (программно). Следует пересмотреть внешние ключи в связанных таблицах!
|
|
|
Ведет Содержит
Номер учителя Номер предмета Номер класса Номер ученика
Рис. 76. ER-диаграммы
Проектирование концептуальной модели данных проведем с использованием метода «объект-связь». Для первых двух объектов степень связи M:N, для двух других – 1:N.
1) По правилу 6 получаем три отношения:
Teacher (num_teacher, FIO_teacher).
Predmet (num_pred, namepred).
Teach_pred (num_teacher, num_pred, nagruzka).
Здесь Teach_pred – связующее отношение, ключ которого является составным (комбинация ключевых полей отношений Teacher и Predmet).
2) По правилу 4 получаем два отношения:
Class (num_class, nameclass).
Pupil (num_pupil, FIO_pupil, ball, num_class).
Num_class – внешний ключ для связи с отношением Class.
Логическая модель проектируемой БД, созданная с использованием пакета ERwin, выглядит следующим образом (рис. 77):
Рис. 77. Логическая модель
Теперь можно приступить к разработке приложения баз данных. Не стоит называть таблицы и атрибуты ключевыми словами SQL (group, index и др. Список ключевых слов находится в файле key_words_SQL.doc).
Создание таблиц базы данных
Для создания файлов (таблиц) базы данных следует воспользоваться утилитой Database Desktop, входящей в состав поставки пакета Delphi (Пуск – Программы – Borland Delphi – Database Desktop).
В окне Database Desktop следует назначить каталог для размещения файлов (будем сохранять таблицы в подкаталоге DBкаталога School ) с помощью пунктов меню File – Working Directory и File – Private Directory. После этого создаваемые таблицы (*.db) и другие объекты БД будут размещаться в указанном каталоге.
Таблица создается с помощью пункта меню File – New – Table; в появившемся окне выбирается ее тип (рис. 78):
Рис. 78. Выбор таблицы типа Paradox7
После этого появится окно, в котором следует набрать имена полей (латинскими буквами), указать типы и размеры полей.
Создадим таблицу Teacher (рис. 79):
Рис. 79. Создание таблицы Teacher
Ключевое поле (помечается символом «*») необходимо определить первым. Это будет использовано в дальнейшем! Условимся создавать ключевое поле с именем num_ИмяТаблицы (например, Num_Class) типа Long Integer, которое затем будем формировать программно (это будет своего рода счетчик записей, генерирующий уникальные значения).
Для указания типа поля необходимо нажать на «пробел», появится список доступных типов. Будем использовать следующие типы полей:
- A (Alpha) – символьные значения длиной до 255 символов.
- N (Number) – числовые значения с плавающей точкой.
- I (Long Integer) – длинные целые числа в диапазоне
-2147483648..2147483647.
- S (Short) – короткие целые числа в диапазоне -32768..32767.
- L (Logical) – логические значения (true, false).
- D (Date) – значение даты.
Для строковых полей можно указать размер Size.
Для полей созданной таблицы существует возможность определить бизнес-правила (Validity Checks), которые задают ограничения на значения данных в БД. Например, можно указать диапазон вводимых значений для поля Год в строках ввода Minimum Value, Maximum Value, указать значение поля по умолчанию в поле Default Value(например, для поля Пол – «м»). Также можно пометить, что поле является обязательным для ввода (установить флажок Required Field).
Сохраним таблицу под именем Teacher.
Аналогично создадим таблицу Predmet (рис. 80):
Рис. 80. Создание таблицы Predmet
Название предмета (Namepred) ограничим пятнадцатью символами. После задания полей и их свойств, сохраним созданную таблицу под именем Predmet.
Теперь создадим связующую таблицу Teach_pred, в которую добавим дополнительное поле nagruzka, характеризующее нагрузку учителя по определенному предмету (рис. 81).
Однако заметим, что связующая таблица может и не содержать собственных полей.
Рис. 81. Создание связующей таблицы teach_pred
Далее создадим таблицы class и pupil (рис. 82-83):
Рис. 82. Создание таблицы Class
Рис. 83. Создание таблицы Pupil
Здесь num_class – внешний ключ, необходимый для связи с таблицей Class.
Для изменения полей и их свойств, если это необходимо, следует открыть изменяемую таблицу (File – Open – Table...) и перевести ее в режим реструктуризации (переопределения структуры), выбрав пункт менюTable – Restructure.
После определения полей следует определить индексы. Это делается путем выбора из списка свойств таблицы (Table Properties) строки Secondary Indexes и нажатия кнопки Define(определить).В появившемся окне определяется выражение для индекса и его свойства. Индексы нужны для сортировки записей таблицы в определенном порядке. Они также используются для ускорения поиска записей по выбранным полям; в этом случае в индекс входят поля, которые часто используются для поиска.
Можно создавать несколько индексов, которые затем программно можно будет переключать.
Например, создадим индекс для таблицы Teacher по полю FIO_teacher(рис. 84). Отметим индекс как уникальный (Unique), т.к. в одной школе не будет учителей с одинаковыми ФИО, и определим убывающую сортировку (Descending):
Рис. 84. Создание индекса
Назовем созданный индекс Ind_FIO (рис. 85):
Рис. 85. Сохранение индекса
После создания индексов таблица сохраняется.
4.1.2 Определение связи между таблицами и ссылочной целостности
Теперь необходимо определить ссылочную целостность между таблицами БД.
Покажем, как связать две таблицы, находящиеся в отношении 1:N (один ко многим). Напомним, что в каждую дочернюю таблицу мы добавили дополнительное поле в качестве внешнего ключа для связи с родительской таблицей, совпадающее с ключевым полем родительской таблицы.
Откроем дочернюю таблицу pupil в режиме реструктуризации (Table, Restructure). Из свойств таблицы следует выбрать свойство Referential Integrity (ссылочная целостность) и нажать кнопку Define. В правой части появившегося окна (рис. 86) выбирается родительская таблица (в нашем случае Class). По двойному щелчку (или нажатию кнопки с изображением стрелки) в поле Parent's Key (ключ родительской таблицы) занесется ключ родительской таблицы (num_class). В правой части (Fields) выбирается внешний ключ дочерней таблицы (num_class). Типы связующих полей должны совпадать. При правильной установке полей связи в середине окна появится линия между связующими полями, изображающая связь:
Рис. 86. Определение ссылочной целостности таблицы Pupil
Переключатели Updates rules определяют вид каскадных воздействий на таблицу при изменении значения поля связи или при удалении в ней записи:
- Cascade – разрешены каскадные изменения и удаления подчиненных записей в дочерней таблице;
- Prohibit – запрещены изменения полей связи и удаление записи в родительской таблице, если для данной записи есть связанные записи в дочерней таблице.
Разрешим каскадные изменения и удаления. После нажатия кнопки ОК следует дать имя ссылочной целостности, например (cl_pupil). После этого необходимо сохранить таблицу (Save).
Созданную ссылочную целостность можно будет в дальнейшем изменить (Modify) или удалить (Erase).
Покажем, как определить ссылочную целостность для таблиц teacher и predmet, находящихся в отношении M:N. Для реализации такой связи мы создали связующую таблицу teach_pred (num_teacher, num_pred, nagruzka). Связующая таблица содержит в качестве ключевых полей два поля (num_teacher, num_pred) и является дочерней по отношению к таблицам Teacher и Predmet. Откроем таблицу teach_pred в режиме реструктуризации и определим ссылочную целостность.
Сначала выберем в качестве родительской таблицу Teacher (рис. 87):
Рис. 87. Определение ссылочной целостности с таблицей Teacher
Сохраним ссылочную целостность под именем t_teach_pred.
Аналогично определим ссылочную целостность с таблицей Predmet. Теперь в качестве родительской таблицы выберем Predmet (рис. 88):
Рис. 88. Определение ссылочной целостности с таблицей Predmet
Назовем созданную ссылочную целостность p_teach_pred. Таким образом, связующая таблица teach_pred имеет два ограничения ссылочной целостности (рис. 89):
Рис. 89. Созданные ограничения ссылочной целостности связующей таблицы
После этого можно приступить к созданию приложения с использованием Delphi. Разработка приложения состоит из нескольких этапов.