Все построенные таблицы находятся в первой нормальной форме, т.к. каждый столбец таблицы неделим и в рамках одной таблицы нет столбцов с одинаковыми по смыслу значениями.
Таблица «Сводная ведомость» через столбцы ID_Студент и ID_План связывает информацию о студенте с информацией о конкретной дисциплине и фиксирует оценку, полученную студентом. Оценка и дата сдачи экзамена (зачета) однозначно зависят от содержимого столбцов ID_Студент и ID_План, которые представляют собой составной первичный ключ. Таким образом, все таблицы имеют первичные ключи, которые однозначно определяют строки и не избыточны, и можно говорить о том, что таблицы находятся во второй нормальной форме.
Рассмотрим подробнее таблицу «Учебный_план», которая содержит перечень дисциплин текущего учебного плана. Первичным ключом таблицы служит столбец ID_План, который однозначно характеризует каждую дисциплину учебного плана с точностью до семестра, т.е. для дисциплин, протяженность изучения которых более одного семестра, в таблице будет отведено столько строк, сколько семестров длится изучение дисциплины. Тогда хранение наименований дисциплин в таблице «Учебный_план» становится избыточным: например, если изучение английского языка длится 6 семестров, то наименование «Английский язык» будет повторено в 6 записях и есть вероятность сделать 6 различных ошибок при вводе одного и того же наименования.
Чтобы избежать этого, проведем декомпозицию отношения «Учебный план», выделив наименования дисциплин в отдельное отношение. В результате получим дополнительную таблицу «Дисциплины» со столбцами ID_Дисциплина и Наименование, а столбец Наименование в таблице «Учебный_план» заменим столбцом ID_Дисциплина, сформировав тем самым вторичный ключ, связывающий новую таблицу с таблицей «Учебный_план».
Теперь можно говорить о базе данных «Сессия», реляционная схема которой представлена следующими пятью таблицами:
«Студенты» - содержит по одной строке для каждого из студентов;
«Учебный_план» - содержит по одной строке для отдельной дисциплины отдельного семестра;
«Дисциплины» - содержит по одной строке для наименования дисциплины;
«Сводная_ведомость» - содержит по одной строке для каждого результата сдачи отдельным студентом отдельной дисциплины;
«Кадровый_состав» - содержит по одной строке для каждого из преподавателей.
На рис. 6.9. в графической форме изображены перечисленные таблицы, их столбцы, первичные и внешние ключи. Задание первичных и внешних ключей сопровождается построением дополнительных структур – индексов, обеспечивающих быстрый доступ к данным через значение ключа.
Все таблицы базы данных «Сессия» находятся в третьей нормальной форме:
каждый столбец таблицы неделим и в рамках одной таблицы нет столбцов с одинаковыми по смыслу значениями (1НФ);
первичные ключи однозначно определяют запись и не избыточны, все поля каждой из таблиц зависят от ее первичного ключа (2НФ);
значение любого поля, не входящего в первичный ключ, не зависит от значения другого поля, тоже не входящего в первичный ключ (3НФ).
Следующий этап проектирования – определение доменов (типов) данных, хранящихся в столбцах таблиц. Параллельно с заданием типа необходимо сформулировать ограничения целостности, связанные с типом - перечень допустимых значений типа.
Исходя из особенностей данных и их функционального назначения, требуется задать способ представления и границы возможных изменений для каждого из столбцов таблиц. При этом необходимо ответить на вопрос, данные каких типов должны храниться в столбцах и какова их максимальная длина (например, если в столбце предполагается хранить процентные значения, то достаточно будет целого типа данных длиной 1 байт, так как диапазон возможных значений от 0 до 255; если для данных столбца выбирается тип «строка символов», то желательно указать максимальный размер данных столбца и т.п.).
Далее, в каждой таблице должны быть выделены столбцы, которые обязательно должны быть заполнены при создании отдельной строки таблицы. Задание такого ограничения целостности не позволит, например, ввести в таблицу «Студенты» строку, в которой не указан номер группы. Если подобные ограничения целостности не будут заданы, в таблице могут появиться строки, которые не будут учтены при выполнении функций по обработке данных: появление в таблице «Студенты» строки без номера группы приведет к ошибке при формировании ведомости.
Следующий важный момент - задание для столбцов значений по умолчанию. Значение по умолчанию впоследствии будет автоматически вводиться в указанный столбец для каждой строки таблицы. Например, в столбец Дата_сдачи таблицы «Сводная ведомость» при заполнении очередной строки может автоматически заноситься текущая дата.
Ниже представлены таблицы базы данных «Сессия» с типами данных столбцов и предлагаемыми ограничениями целостности.
Рис. 6.9. Структура базы данных «Сессия»
Таблица «Студенты»
Наименование столбца |
Тип данных |
Ограничения |
ID_Студент |
Целое число |
Значение уникально |
Фамилия |
Строка символов размером 30 |
Значение не должно быть пустым |
Имя |
Строка символов размером 15 |
Значение не должно быть пустым |
Отчество |
Строка символов размером 20 |
Значение не должно быть пустым |
Номер группы |
Целое число |
Значение не должно быть пустым |
Адрес |
Строка символов размером 30 |
|
Телефон |
Строка символов размером 8 |
|
Таблица «Дисциплины»
Наименование столбца |
Тип данных |
Ограничения |
ID_Дисциплина |
Целое число |
Значение уникально |
Наименование |
Строка символов размером 20 |
Значение уникально |
Таблица «Кадровый_состав»
Наименование столбца |
Тип данных |
Ограничения |
ID_Преподаватель |
Целое число |
Значение уникально |
Фамилия |
Строка символов размером 30 |
Значение не должно быть пустым |
Имя |
Строка символов размером 15 |
Значение не должно быть пустым |
Отчество |
Строка символов размером 20 |
Значение не должно быть пустым |
Должность |
Строка символов размером 20 |
Значение не должно быть пустым |
Кафедра |
Строка символов размером 3 |
Значение не должно быть пустым |
Адрес |
Строка символов размером 30 |
|
Телефон |
Строка символов размером 8 |
|
Таблица «Учебный план»
Наименование столбца |
Тип данных |
Ограничения |
ID_План |
Целое число |
Значение уникально |
ID_Дисциплина |
Целое число |
Значение не должно быть пустым |
Семестр |
Целое число |
Значение не должно быть пустым и находится в интервале от 1 до 10 |
Количество часов |
Целое число |
|
ID_Преподаватель |
Целое число |
|
Таблица «Сводная ведомость»
Наименование столбца |
Тип данных |
Ограничения |
ID_Студент |
Целое число |
Значение не должно быть пустым |
ID_План |
Целое число |
Значение не должно быть пустым |
Оценка |
Целое число |
Значение не должно быть пустым и должно находится в интервале от 0 до 5 |
Дата сдачи |
Дата-время |
Значение не должно быть пустым, по умолчанию – текущая дата |
Все примеры использования языка SQL (StructuredQueryLanguage), рассматриваемые в следующей главе, будут построены на основе этой учебной базы данных «Сессия».
Контрольные задания
1. Приведите примеры дополнительных функций, которые могут быть реализованы с помощью таблиц БД «Сессия».
2. Проведите декомпозицию отношения «Кадровый состав», выделив отношение «Штатное расписание».
3. Проведите декомпозицию отношения «Кадровый состав», выделив отношение «Структура факультета».
4. Какие изменения должны быть внесены в структуру БД «Сессия» для реализации функции назначения стипендии?
5.