Покажем, что в схеме БД нет атрибутов, зависящих от неключевых.
Для сущности «Сотрудник» атрибут «Должность» не зависит от атрибута «ФИО», ибо значения атрибута «ФИО» не уникальны, а значит, для одного и того же значения атрибута «ФИО» может быть несколько значений атрибута «Должность». Обратная зависимость тоже отсутствует, ибо значение атрибута «Должность» не уникально. Атрибут «Служебный телефон» мог бы рассматриваться как альтернативный ключ, если бы не мог содержать неопределенных значений.
У сущности «Корпуса» имеется только один неключевой атрибут «Адрес».
У сущности «Аудитории» имеются три неключевых атрибута: «Табельный номер сотрудника», «Число посадочных мест» и «Тип». Покажем, что между ними нет функциональных зависимостей. Один сотрудник может быть ответственным за несколько аудиторий, среди которых могут оказаться и аудитории с разным числом посадочных мест, значит значения атрибута «Число посадочных мест» не зависят функционально от значений атрибута «Табельный номер сотрудника». Для разных аудиторий, характеризующихся одним и тем же числом посадочных мест, могут быть разные сотрудники, значит значения атрибута «Табельный номер сотрудника» не зависят функционально от значений атрибута «Число посадочных мест». Значения атрибута «Тип» не уникальны, то есть один и тот же тип может быть у различных аудиторий, среди которых могут оказаться как несколько аудиторий, к которым прикреплены разные сотрудники, так и несколько аудиторий, характеризующихся разным числом посадочных мест. Значит ни значения атрибута «Табельный номер сотрудника», ни атрибута «Число посадочных мест» функционально не зависят от значений атрибута «Тип». Аналогично можно показать, что атрибут «Тип» не зависит ни от одного из атрибутов «Табельный номер сотрудника» и «Число посадочных мест», ибо один сотрудник может быть ответственным за несколько аудиторий, среди которых могут оказаться несколько аудиторий, имеющих разный тип, также как и среди нескольких аудиторий с одним и тем же числом посадочных мест могут оказаться несколько аудиторий, имеющих разный тип.
Определим таблицы базы данных и укажем типы данных и ограничения для каждого поля.
Таблица Аудитории (Auditoriums)
Наименование поля | Тип данных | Ограничения |
Название корпуса (name_build) | Строка (20) | Входит в состав первичного ключа |
Номер аудитории (number_aud) | Целое число | Входит в состав первичного ключа |
Табельный номер сотрудника (number_emp) | Целое число | NOT NULL |
Число посадочных мест (number_pla) | Целое число | NOT NULL |
Тип (type_) | Строка (20) | NOT NULL |
Таблица Корпуса (Buildings)
Наименование поля | Тип данных | Ограничения |
Название корпуса (Name_build) | Строка (20) | Первичный ключ |
Адрес (Address) | Строка (20) | NOTNULL |
Таблица Сотрудники (Employees)
Наименование поля | Тип данных | Ограничения |
Табельный номер сотрудника (number_emp) | Целое число | Первичный ключ |
ФИО (FIO) | Строка (30) | NOT NULL |
Должность (Jobtitle) | Строка (20) | NOT NULL |
Служебный телефон (telephone) | Строка (10) |
Создадим проект приложения баз данных. Для чего выберем в главном меню File – New, затем выберем Project и укажем NewFile – введём имя проекта Auditoriums и сохраним файл проекта (*.PJT). Далее откроется окно ProjectManager (диспетчер проектов) в котором перейдём на вкладку Data (Данные) и выберем пункт FreeTables(Свободные таблицы) и нажмём кнопку New. Появится окно, в котором выберем NewTable (Новая таблица) и сохраним таблицу как Auditoriums.dbf. После этого на экране появится диалоговое окно TableDesigner(Конструктор таблиц) в котором введём названия всех полей таблицы Аудитории (Auditoriums), укажем их типы данных и ограничения.
Рис. 2.15.5. Построение таблицы Аудитории (Auditoriums)
Аналогично создадим две другие таблицы Buildings.dbfи Employees.dbf.
Теперь создадим базу данных и добавим в неё уже созданные свободные таблицы. В окне Диспетчера проектов на вкладке Data выберем пункт Databases и нажмём кнопку New. Появится окно, в котором выберем NewDatabase (Новая база данных) и сохраним базу данных как Auditoriums.dbc. В появившемся окне DatabaseDesigner (Построитель базы данных) выберем из контекстного меню Add Table… (Добавить таблицу)
Рис. 2.15.6. Добавление таблицы в БД
В появившемся диалоговом окне открытия файла выберем сразу все три созданные таблицы и нажмём ОК.
Определим индексы для таблиц. Для этого в окне Диспетчера проектов на вкладке Data выберем пункт Databases, затем выберем созданную базу данных Auditoriums, в которой выберем пункт Tables (Таблицы). Появится список из трёх добавленных в базу данных таблиц, в котором выберем таблицу Auditoriums и нажмём кнопку Modify (Изменить). В появившемся окне конструктора таблиц перейдём на вкладку Indexes (Индексы). Создадим индекс первичного ключа таблицы. В поле Name введём имя индекса PK_auditor, а из раскрывающегося списка Type (Тип) выберем тип индекса Primary (Первичный), затем нажмём кнопку справа от поля Expression (Выражение) и введём значение индексного выражения в окне построителя выражений «ALLTRIM(name_build+STR(number_aud))», что означает конкатенацию двух строковых значений: значения поля name_build, имеющего стоковой тип и строкового представления числа, взятого из поля number_aud. Преобразование числа в строку осуществляется при помощи функции STR. Функция ALLTRIM убирает из выражения начальные и конечные значения. Так как совокупность значений этих строк должна быть уникальной, то при вводе данных в таблицу будет проверятся уникальность значения этого индекса, то есть совокупности значений двух полей, хотя по отдельности в этих полях могут присутствовать одинаковые значения.
Теперь создадим два регулярных индекса для определения внешних ключей. Первый FK_buildin, тип – Regular, выражение – «name_build» и второй FK_employe, тип – Regular, выражение – «number_emp».
Аналогично определим первичные ключи при помощи индекса Primary для двух других таблиц, назовём их PK_buildin и PK_employe.
Создадим отношения между таблицами. Для этого в окне конструктора базы данных щёлкаем мышью на имени индекса PK_buildin таблицы Buildings к индексу FK_buildin таблицы Auditoriums.
Рис. 2.15.7. Схема отношений базы данных
Создадим три формы по одной для каждой таблицы при помощи мастера форм. Для создания формы нужно в окне Диспетчера проектов перейти на вкладку Documents, где выбрать пункт Form и нажать кнопку New. Выберем FormWizard, затем выберем мастера создания формы с одной таблицы FormWizard. На первом шаге необходимо выбрать таблицу и поля, которые будут применяться в форме. Укажем таблицу AUDITORIUMS базы данных AUDITORIUMS (не свободную таблицу, потому, что мы её уже добавили в базу данных) и выберем все поля, переместив их в список Selectedfields (Выбранные поля).
Рис. 2.15.8. Создание формы при помощи мастера форм
На втором шаге выберем стиль формы.
На третьем шаге укажем поля, по которым будет происходить упорядочение записи и порядок сортировки записей. Выберем упорядочение по значению поля Название корпуса (name_build), для чего переместим его в список Selectedfields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На четвёртом шаге введём заголовок для формы в поле Typeatitleforyourform, введём Аудитории. Выберем SaveandmodifyitintheFormdesigner (Сохранить и изменить форму в Конструкторе форм).
Форма откроется в окне конструктора форм, в котором изменим надписи, для чего выделим нужную надпись и в окне свойств Properties - auditoriums.scx изменим свойство Caption. Сохраним изменения, выбрав File – Save.
Рис. 2.15.9. Форма для таблицы «Аудитории»
Аналогично создадим формы для двух других таблиц.
Создадим форму для двух связанных таблиц Аудитории (Auditoriums) и Корпуса (Buildings)(Рис. 2.15.10.). Для этого выберем мастера создания формы, использующего связанные таблицы One-toFormWizard.
На первом шаге необходимо выбрать поля из родительской таблицы, которые будут применяться в форме. Выберем таблицу Buildings базы данных AUDITORIUMS и выберем из этой таблицы поля Название корпуса (Name_building) и Адрес (Address), переместив их в список Selectedfields (Выбранные поля).
На втором шаге выберем поля из дочерней таблицы. Здесь мы выберем таблицу Auditoriums и выберем из этой таблицы поля Номер аудитории (Number_aud), Число посадочных мест (Number_pla) и Тип (type_).
На третьем шаге указывается связь таблиц. Оставим связку по полю Название корпуса (Name_build).
На четвёртом шаге укажем стиль формы.
На пятом шаге укажем поля, по которым будет происходить упорядочение записи и порядок сортировки записей. Выберем упорядочение по значению поля Название корпуса (name_build) и дополнительную сортировку по полю Адрес (Address), для чего переместим их в список Selectedfields (Выбранные поля). Укажем сортировку по возрастанию (Ascending).
На шестом шаге введём заголовок для формы в поле Typeatitleforyourform, введём Аудитории и корпуса. Выберем SaveandmodifyitintheFormdesigner (Сохранить и изменить форму в Конструкторе форм). Сохраним форму как Auditoriums and Buildings.scx.