В соответствие с процедурой проектирования (п. 4.4) каждая из полученных сущностей должна быть представлена базовой таблицей. Первый вариант этих таблиц описывается так:
СОЗДАТЬ ТАБЛИЦУ Создатели *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_создат ) ПОЛЯ ( Код_создат Целое, Фам_ИО Текст 30 ); СОЗДАТЬ ТАБЛИЦУ Издательства *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_издательства ) ПОЛЯ ( Код_издательства Целое, Название Текст 40, Город Текст 25 ); СОЗДАТЬ ТАБЛИЦУ Заглавия *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_заглавия ) ПОЛЯ ( Код_заглавия Целое, Заглавие Запись ); СОЗДАТЬ ТАБЛИЦУ Вид_издания *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Вид_издания ) ПОЛЯ ( Вид_издания Целое, Название_вида Текст 16); СОЗДАТЬ ТАБЛИЦУ Характеры *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_характера ) ПОЛЯ ( Код_характера Целое, Характер_переиздания Текст 16 ); СОЗДАТЬ ТАБЛИЦУ Языки *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_языка ) ПОЛЯ ( Код_языка Целое, Язык Текст 16, Сокращение Текст 6 ); СОЗДАТЬ ТАБЛИЦУ Места *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_места ) ПОЛЯ ( Код_места Целое, Номер_комнаты Целое, Номер_стелажа Целое, Номер_полки Целое ); СОЗДАТЬ ТАБЛИЦУ Читатели *( Стержневая сущность ) ПЕРВИЧНЫЙ КЛЮЧ ( Ном_билета ) ПОЛЯ ( Ном_билета Целое, Фамилия Текст 20, Имя Текст 16, Отчество Текст 20, Адрес Текст 60, Телефон Текст 9 ); СОЗДАТЬ ТАБЛИЦУ Издание *( Обозначение ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_издания ) ВНЕШНИЙ КЛЮЧ ( Код_заглавия ИЗ Заглавия NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Заглавия ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Заглавия.Код_заглавия ОГРАНИЧИВАЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Вид_издания ИЗ Вид_издания NULL-значения ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Вид_издания ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Вид_издания.Вид_издания КАСКАДИРУЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Код_издательства ИЗ Издательства NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Издательства ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Издательства.Код_издательства КАСКАДИРУЕТСЯ) ПОЛЯ ( Код_издания Целое, Код_заглавия Целое, Вид_издания Текст 16, Номер_тома Целое, Авторский_знак Текст 3, Библиотечн_шифр Текст 12, Повторность Целое, Код_издательст- ва Целое, Год_издания Целое ) ОГРАНИЧЕНИЯ ( 1. Значения полей Код_заглавия, Вид_издания и Код_издательства должны принадлежать набору значений соответствующих полей таблиц Заглавия, Вид_издания и Издательства; при нарушении вывод сообщения "Такого заглавия нет", "Такого вида издания нет" или "Такого издательства нет". ); СОЗДАТЬ ТАБЛИЦУ Переплеты *( Обозначение ) ПЕРВИЧНЫЙ КЛЮЧ ( Номер_переплета ) ВНЕШНИЙ КЛЮЧ ( Код_издания ИЗ Издания NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Издания ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Издания.Код_издания КАСКАДИРУЕТСЯ) ПОЛЯ ( Номер_переплета Целое, Код_издания Целое, Цена Деньги, Дата_приобретения Дата ) ОГРАНИЧЕНИЯ ( Значения поля Код_издания должны принадлежать набору значений соответствующего поля таблицы Издания; при нарушении вывод сообщения "Такого издания нет" ); СОЗДАТЬ ТАБЛИЦУ Аннотации *( Характеризует Издания ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_издания ) ВНЕШНИЙ КЛЮЧ ( Код_издания ИЗ Издания NULL-значения ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Издания ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Издания.Код_издания КАСКАДИРУЕТСЯ) ПОЛЯ ( Код_издания Целое, Аннотация Запись ) ОГРАНИЧЕНИЯ ( Значения поля Код_издания должны принадлежать набору значений соответствующего поля таблицы Издания; при нарушении вывод сообщения "Такого издания нет" ); СОЗДАТЬ ТАБЛИЦУ Авторы *( Связывает Создатели и Издания ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_создателя, Код_издания ) ВНЕШНИЙ КЛЮЧ ( Код_создателя ИЗ Создатели NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Создатели ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Создатели.Код_создателя КАСКАДИРУЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Код_издания ИЗ Издания NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Издания ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Издания.Код_издания КАСКАДИРУЕТСЯ) ПОЛЯ ( Код_создателя Целое, Код_издания Целое ) ОГРАНИЧЕНИЯ ( Значения полей Код_создателя и Код_издания должны принадлежать набору значений соответствующих полей таблиц Создатели и Издание; при нарушении вывод сообщения "Такого автора нет" или "Такого издания нет" );
Аналогичное содержание имеют описания таблиц Составители, Редакторы, Художники и Переиздания. Остальные же таблицы проектируемой базы данных описываются так:
СОЗДАТЬ ТАБЛИЦУ Переводчики *( Связывает Создатели, Издания и Языки) ПЕРВИЧНЫЙ КЛЮЧ ( Код_создателя, Код_издания ) ВНЕШНИЙ КЛЮЧ ( Код_создателя ИЗ Создатели NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Создатели ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Создатели.Код_создателя КАСКАДИРУЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Код_издания ИЗ Издания NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Издания ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Издания.Код_издания КАСКАДИРУЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Код_языка ИЗ Языки NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Языки ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Языки.Код_языка КАСКАДИРУЕТСЯ) ПОЛЯ ( Код_создателя Целое, Код_издания Целое ) ОГРАНИЧЕНИЯ ( Значения полей Код_создателя, Код_издания и Код_языка должны принадлежать набору значений соответствующих полей таблиц Создатели, Издание и Языки; при нарушении вывод сообщения "Такого автора нет" или "Такого издания нет" или "Такого языка нет"); СОЗДАТЬ ТАБЛИЦУ Размещение *( Связывает Места и Переплеты ) ПЕРВИЧНЫЙ КЛЮЧ ( Код_места, Номер_переплета ) ВНЕШНИЙ КЛЮЧ ( Код_места ИЗ Места NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Места ОГРАНИЧИВАЕТСЯ ОБНОВЛЕНИЕ Места.Код_места КАСКАДИРУЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Номер_переплета ИЗ Переплеты NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Переплеты КАСКАДИРУЕТСЯ ОБНОВЛЕНИЕ Переплеты.Ном_переплета КАСКАДИРУЕТСЯ) ПОЛЯ ( Код_места Целое, Номер_переплета Целое, Дата_размещения Дата, Дата_изъятия Дата ) ОГРАНИЧЕНИЯ ( Значения полей Код_места и Номер_переплета должны принадлежать набору значений соответствующих полей таблиц Переплеты и Места; при нарушении вывод сообщения "Такого переплета нет" или "Такого места нет" ); СОЗДАТЬ ТАБЛИЦУ Выдача *( Связывает Читатели и Переплеты ) ПЕРВИЧНЫЙ КЛЮЧ ( Ном_билета, Ном_переплета ) ВНЕШНИЙ КЛЮЧ ( Ном_билета ИЗ Читатели NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Читатели КАСКАДИРУЕТСЯ ОБНОВЛЕНИЕ Читатели.Ном_билета КАСКАДИРУЕТСЯ) ВНЕШНИЙ КЛЮЧ ( Ном_переплета ИЗ Переплеты NULL-значения НЕ ДОПУСТИМЫ УДАЛЕНИЕ ИЗ Переплеты КАСКАДИРУЕТСЯ ОБНОВЛЕНИЕ Переплеты.Ном_переплета КАСКАДИРУЕТСЯ) ПОЛЯ ( Ном_билета Целое, Ном_переплета Целое, Дата_выдачи Дата, Срок Целое, Дата_возврата Дата ) ОГРАНИЧЕНИЯ ( Значения полей Ном_билета и Ном_переплета должны принадлежать набору значений соответствующих полей таблиц Читатели и Переплеты; при нарушении вывод сообщения "Такого читателя нет" или "Такого переплета нет" );
Теперь следует проверить, не нарушены ли в данном прокете какие-либо принципы нормализации (п. 4.6), т.е. что любое неключевое поле каждой таблицы:
Анализ сущностей Переводчики, Размещение и Выдача, состоящих из составного ключа и неключевых полей, показал, что в них нет функциональных связей между неключевыми полями. Последние же не зависят функционально от какой-либо части составного ключа.
Наконец, анализ сущностей Издания, Переплеты, Места, Читатели и Языки, показал, что единственной "подозрительной" сущностью является стержень Языки, имеющий два функционально связанных неключевых поля: Язык и Сокращение.
Поле Язык стало неключевым из-за ввода цифрового первичного ключа Код_языка, заменяющего текстовый возможный ключ Язык. Это позволило уменьшить объем хранимых данных в таблице Переводчики, затраты труда на ввод множества текстовых значений и возможной противоречивости, которая часто возникает из-за ввода в разные поля ошибочных дубликатов (например, "Английский", "Англиский", "Анлийский", "Англйский" и т.п.). Если мы вспомним рекомендации п. 4.5 о замене на время нормализации цифровыз заменителей первичных ключей (Код_языка) на исходный ключ (Язык) или воспользуемся формулировкой НФБК, то окажется, что таблица Языки – нормализована.
Для завершения проекта необходимо было бы ввести в описания таблиц дополнительные сведения об ограничениях целостности (выше указан лишь минимальный их набор) и дать описание некоторых таблиц, но ограниченнный объем публикации не позволяет включать эти подробности, не являющиеся принципиальными для иллюстрации процедуры проектирования.
[Назад] [Содержание] [Литература]