Физическая модель данных используется для привязки модели данных к среде хранения. Эта модель определяет используемые запоминающие устройства, способы физической организации данных в среде хранения. В данном пособии вопрос о физическом проектировании не рассматривается, поскольку для работы с базами данных используются системы управления базами данных, позволяющие вопросы физического проектирования решать автоматически.
5. Пример проектирования базы данных
Рассмотрим пример проектирования базы данных от начала и до конца. В качестве предметной области выберем знакомую вам сферу – вступительные экзамены.
Итак, требуется спроектировать базу данных для хранения информации об абитуриентах и о процессе сдачи вступительных экзаменов на все факультеты Петрозаводского госуниверситета.
Сначала словесно опишем предметную область для того, чтобы точнее определить классы объектов и отношения между ними.
Университет ведет прием на 14 факультетов по 30 специальностям. По каждой специальности определены размер приема и перечень вступительных экзаменов с указанием формы проведения (устно или письменно). Абитуриент подает заявление на один или несколько факультетов на определенные специальности и затем сдает соответствующие экзамены. Абитуриенты для проведения экзаменов разбиваются на группы по 25 человек. Все группы, относящиеся к одной специальности, сдают экзамен по предмету в один день. На экзамене абитуриент получает оценку: 2, 3, 4, 5, 6. По результатам экзаменов проводится зачисление абитуриентов на специальность.
Выделим классы объектов – Абитуриент, Факультет, Специальность, Экзамен – и определим свойства этих классов.
Класс Абитуриент имеет свойства: ФИО, дата рождения, паспортные данные (серия, номер, кем и когда выдан), наличие медали (нет, сереб., зол.).
Класс Экзамен имеет свойства: дата проведения экзамена, название предмета, форма экзамена (устно или письменно).
Класс Факультет имеет свойства: название факультета.
Класс Специальность имеет свойства: название специальности, количество мест.
Определим связи между классами объектов:
1. Абитуриент подает заявление на специальность. Это связь между классами Абитуриент и Специальность. Абитуриент может подать заявление на одну или несколько специальностей. На каждую специальность может быть подано несколько заявлений. Это означает, что связь имеет тип «многие-ко-многим». Абитуриент существует, только если он подал заявление на какую-либо специальность, существование же специальности не зависит от того, есть ли хотя бы одно заявление на эту специальность. Следовательно, связь является обязательной по отношению к классу Абитуриент и необязательной по отношению к классу Специальность. После подачи заявления абитуриент получает экзаменационный лист и приписывается к одной из групп, формируемых по этой специальности, для сдачи вступительных экзаменов. Поэтому связь будет иметь свойства: номер экзаменационного листа и номер группы.
2. Каждый факультет предлагает одну или несколько специальностей, разные факультеты не могут предлагать одинаковые специальности. Эта связь имеет тип «один-ко-многим». Не может быть специальности, не принадлежащей ни к одному факультету, так же как факультета без хотя бы одной специальности. Поэтому связь является обязательной по отношению к обоим классам.
3. По каждой специальности проводится несколько экзаменов. Даже если два экзамена проводятся по одному и тому же предмету в один и тот же день, но на разные специальности, экзамены считаются различными. Связь имеет тип «один-ко-многим». Экзамен существует, только если он проводится по какой-либо специальности. Однако возможна ситуация, когда прием ведется без экзаменов. Поэтому связь является обязательной по отношению к классу Экзамен и необязательной по отношению к классу Специальность.
4. Абитуриент сдает несколько экзаменов. Каждый экзамен сдают несколько абитуриентов. Связь имеет тип «многие-ко-многим». Абитуриент может не сдавать ни одного экзамена (зачислен без сдачи экзаменов). Экзамен может не сдавать ни один абитуриент (все уже зачислены по итогам предыдущих экзаменов). Поэтому связь является необязательной по отношению к обоим классам. При сдаче экзамена абитуриент получает оценку. Оценка будет свойством связи.
После построения концептуальной модели предметной области переходим к проектированию реляционной модели данных. Отношения будем строить по алгоритму, приведенному в разделе 3.5. Для каждого класса объектов и для каждой связи между классами сформируем отдельные отношения. Названия отношений будут соответствовать названиям классов и связей. Атрибутами отношений будут свойства классов и связей.
Первый класс объектов – Абитуриент. Дадим такое же название и отношению. Атрибутами отношения станут свойства этого класса:
Абитуриент(ФИО, Паспорт, Дата_рождения, Медаль).
Отношение не находится в 1НФ, так как атрибуты ФИО и Паспорт являются составными. Атрибут ФИО разобьем на три атрибута: Фамилия, Имя, Отчество. Атрибут Паспорт разобьем на два атрибута: Серия, Номер (информацию о том, кем и когда был выдан паспорт, хранить в базе данных не будем).
Ключом отношения будет совокупность атрибутов {Серия, Номер}, так как они являются уникальными для каждого человека.
Абитуриент(Фамилия, Имя, Отчество, Серия, Номер, Дата_рождения, Медаль).
Домены:
dom(Фамилия) = {строка символов длиной 25};
dom(Имя) = {строка символов длиной 25};
dom(Отчество) = {строка символов длиной 30};
dom(Серия) = {строка символов длиной 5};
dom(Номер) = {целое шестизначное число};
dom(Дата_рождения) = {дата};
dom(Медаль) = {множество {золотая, серебряная, нет}}.
Следующий класс – Факультет. Этот класс имеет только один атрибут – Название, поэтому отношение Факультет будет состоять из одного атрибута, который и будет ключом отношения:
Факультет(Название) .
Домены:
dom(Название) = {строка символов длиной 100}.
Для класса Специальность сформируем отношение Специальность с двумя атрибутами:
Специальность(Название, Набор).
Специальности имеют неповторяющиеся названия, следовательно, атрибут Название можно сделать ключом отношения.
Специальность(Название, Набор).
Домены:
dom(Название) = {строка символов длиной 200};
dom(Набор) = {целое трехзначное число}.
Ключом отношения является атрибут Название. Домен этого атрибута представляет собой строку символов длиной 200. Атрибут с таким доменом лучше не использовать в качестве ключа, так как значения его слишком велики. В данной ситуации рациональнее будет ввести дополнительный атрибут Номер_специальности и сделать его ключом отношения (суррогатный ключ):
Специальность(Номер_специальности, Название, Набор).
Домены:
dom(Номер_специальности) = {целое число};
dom(Название) = {строка символов длиной 200};
dom(Набор) = {целое трехзначное число}.
Для класса Экзамен сформируем отношение, состоящее из трех атрибутов:
Экзамен(Предмет, Дата, Форма).
Так как в один и тот же день могут проводиться экзамены по одному предмету, но на разные специальности, то чтобы отличать разные экзамены, включим в схему отношения Экзамен дополнительный атрибут Номер, который и будет ключом отношения (суррогатный ключ):
Экзамен(Номер, Предмет, Дата, Форма).
Домены:
dom(Номер) = {целое трехзначное число};
dom(Предмет) = {строка символов длинной 30};
dom(Дата) = {дата};
dom(Форма) = {множество {устно, письменно}}.
Теперь сформируем отношения для связей между классами.
Отношение, соответствующее связи между классами Абитуриент и Специальность, назовем Заявление. Схема этого отношения будет включать в себя ключ отношения Абитуриент (атрибуты {Серия, Номер}) и ключ отношения Специальность (атрибут Номер_специальности), а также атрибуты Группа и Лист, соответствующие свойствам связи:
Заявление(Серия, Номер, Номер_специальности, Группа, Лист).
Абитуриент может подать заявления на несколько специальностей, поэтому ключом отношения будут атрибуты {Серия, Номер, Номер_специальности}:
Заявление(Серия, Номер, Номер_специальности, Группа, Лист).
Домены:
dom(Группа) = {целое двухзначное число};
dom(Лист) = {целое трехзначное число}.
Совокупность атрибутов {Серия, Номер} является внешним ключом, ссылающимся на ключ отношения Абитуриент.
Атрибут Специальность является внешним ключом, ссылающимся на ключ отношения Специальность.
Отношение, соответствующее связи между классами Факультет и Специальность, назовем СпециальностиФакультета. Схема этого отношения будет включать в себя ключ отношения Факультет (атрибут Факультет) и ключ отношения Специальность (атрибут Специальность). Ключом отношения будет атрибут Специальность. Значения этого атрибута повторяться не будут, так как каждая специальность относится только к одному факультету (связь имеет тип «один-ко-многим»):
СпециальностиФакультета(Факультет, Специальность).
Схема отношения Специальность и схема отношения СпециальностиФакультета имеют одинаковые ключи и содержат информацию об одних и тех же объектах – специальностях. Эти две схемы можно объединить в одну под названием Специальность:
Специальность(Номер_специальности, Название, Набор, Факультет).
Кортежи отношения Факультет содержат только названия всех факультетов университета. Такое отношение само по себе для базы данных, связанной с вступительными экзаменами, не нужно. В данной предметной области нас интересует только связь класса Специальность с классом Факультет. Поэтому отношение Факультет исключим из модели данных.
Отношение, соответствующее связи между классами Специальность и Экзамен, назовем ЭкзаменыПоСпециальности. Схема этого отношения будет включать в себя ключ отношения Специальность (атрибут Специальность) и ключ отношения Экзамен (атрибут Экзамен). Ключом отношения будет атрибут Экзамен. Значения этого атрибута повторяться не будут, так как каждый экзамен проводится только по одной специальности (связь имеет тип «один-ко-многим»):
ЭкзаменыПоСпециальности(Специальность, Экзамен).
Схема отношения Экзамен и схема отношения ЭкзаменыПоСпециальности имеют одинаковые ключи и содержат информацию об одних и тех же объектах – экзаменах. Эти две схемы можно объединить в одну схему под названием Экзамен:
Экзамен(Номер, Предмет, Дата, Форма, Специальность).
Атрибут Специальность является внешним ключом, ссылающимся на ключ отношения Специальность.
Последняя связь – связь между классами Абитуриент и Экзамен. Дадим соответствующей ей схеме отношения название Оценки. Схема этого отношения будет включать ключ отношения Абитуриент (атрибуты {Серия, Номер}), ключ отношения Экзамен (атрибут Экзамен) и атрибут Оценка, соответствующий свойству связи:
Оценки(Серия, Номер, Экзамен, Оценка).
Так как абитуриент не может дважды сдавать один и тот же экзамен, то ключом будут атрибуты {Серия, Номер, Экзамен}:
Оценки(Серия, Номер, Экзамен, Оценка).
Домены:
dom(Оценка) = {множество {2, 3, 4, 5, 6, зачет, незачет}}.
Совокупность атрибутов {Серия, Номер} является внешним ключом, ссылающимся на ключ отношения Абитуриент.
Атрибут Экзамен является внешним ключом, ссылающимся на ключ отношения Экзамен.
Таким образом, даталогическая модель будет состоять из пяти отношений. Все отношения уже находятся в 3НФ.
-
Абитуриент(Фамилия, Имя, Отчество, Серия, Номер, Дата_рождения, Медаль)
dom(Фамилия) = {строка символов длиной 25};
dom(Имя) = {строка символов длиной 25};
dom(Отчество) = {строка символов длиной 30};
dom(Серия) = {строка символов длиной 5};
dom(Номер) = {целое шестизначное число};
dom(Дата_рождения) = {дата};
dom(Медаль) = {множество {золотая, серебряная, нет}}.
-
Специальность(Номер_специальности, Название, Набор, Факультет)
dom(Номер_специальности) = {целое число};
dom(Название) = {строка символов длиной 200};
dom(Набор) = {целое трехзначное число};
dom(Факультет) = {строка символов длиной 30}.
-
Экзамен(Номер, Предмет, Дата, Форма, Специальность)
-
Атрибут Специальность является внешним ключом, ссылающимся на ключ отношения Специальность.
dom(Номер) = {целое трехзначное число};
dom(Предмет) = {строка символов длинной 30};
dom(Дата) = {дата};
dom(Форма) = {множество {устно, письменно}};
dom(Специальность) = {целое число}.
-
Заявление(Серия, Номер, Специальность, Группа, Лист)
-
Совокупность атрибутов {Серия, Номер} является внешним ключом, ссылающимся на ключ отношения Абитуриент.
-
Атрибут Специальность является внешним ключом, ссылающимся на ключ отношения Специальность.
dom(Серия) = {строка символов длиной 5};
dom(Номер) = {целое пятизначное число};
dom(Специальность) = {целое число};
dom(Группа) = {целое двухзначное число};
dom(Лист) = {целое трехзначное число}.
-
Оценки(Серия, Номер, Экзамен, Оценка)
-
Совокупность атрибутов {Серия, Номер} является внешним ключом, ссылающимся на ключ отношения Абитуриент.
-
Атрибут Экзамен является внешним ключом, ссылающимся на ключ отношения Экзамен.
dom(Серия) = {строка символов длиной 5};
dom(Номер) = {целое пятизначное число};
dom(Экзамен) = {целое трехзначное число};
dom(Оценка) = {множество {2, 3, 4, 5, 6, зачет, незачет}}.
Модель данных готова.
-
Ульман Дж. Основы систем баз данных. М.: Финансы и статистика, 1983. 334 с.
-
Тиори Т., Фрай Дж. Проектирование структур баз данных: В 2 т. М.: Мир, 1985.
-
Цикритзис Д., Лоховски Ф. Модели данных. М.: Финансы и статистика, 1985. 343 с.
-
Дейт К. Дж. Введение в системы баз данных: Пер. с англ. Киев, М., СПб.: Издательский дом "Вильямс", 2000. 848 с.
-
Карпова Т. С. Базы данных: модели, разработка, реализация. СПб.: Питер, 2001. 304 с.
Оглавление
Учебное пособие 1
Введение 2
1. Этапы проектирования базы данных 3
2. Модель предметной области 5
2.1. Объекты и классы объектов 6
2.2. Связи между классами объектов 7
2.3. Типы связей в предметной области 8
3. Реляционная модель данных 12
3.1. Структура 12
3.2. Операции 17
3.3. Ограничения целостности 29
3.4. Нормализация отношений 30
3.5. Построение реляционной модели данных 40
4. Физическая модель данных 42
5. Пример проектирования базы данных 42
Список использованной литературы 53
Оглавление 54
Достарыңызбен бөлісу: |