5.3. Проектирование базы данных

В соответствие с процедурой проектирования (п. 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 о замене на время нормализации цифровыз заменителей первичных ключей (Код_языка) на исходный ключ (Язык) или воспользуемся формулировкой НФБК, то окажется, что таблица Языки – нормализована.

Для завершения проекта необходимо было бы ввести в описания таблиц дополнительные сведения об ограничениях целостности (выше указан лишь минимальный их набор) и дать описание некоторых таблиц, но ограниченнный объем публикации не позволяет включать эти подробности, не являющиеся принципиальными для иллюстрации процедуры проектирования.

[Назад] [Содержание] [Литература]