Правильная ссылка на эту страницу
http://az-design.ru/Projects/AzBook/Review/Kirillov_ch12.shtml

Глава 12. Пример проектирования базы данных "LIBRARY"

12.1. Назначение и предметная область

       База данных предназначена для хранения данных о приобретенных библиотекой изданиях (монографиях, справочниках, сборниках статей и т.п.), информации о местонахождении отдельных экземпляров каждого издания и сведений о читателях.

Д27

Дейт К. Руководство по реляционной СУБД DB2 / Пер. с англ. и предисл. М.Р.Когаловского. – М.: Финансы и статистика, 1988. – 320 с.: ил.

ISBN 5-279-00063-9

Книга американского специалиста в области реляционных баз данных К.Дейта, автора популярной в СССР монографии "Введение в системы баз данных" (М.: Наука, 1981), представляет собой руководство по перспективной СУБД фирмы ИБМ DB2, сочетающей возможности широко известной системы IMS/VS и реляционной СУБД.

Для специалистов по программному обеспечению информационных систем и студентов вузов.

ББК 32.973


Рис. 5.1. Макет аннотированной каталожной карточки

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


Научно-популярное издание К.Дж. Дейт
Введение в системы баз данных 8-е издание

Литературный редактор С.Г. Татарепко
Верстка М.А. Смолина
Художественный редактор С.А. Чернокозинский
Корректоры З.В. Александрова, Л.А.Гордиенко,
О.В.Мишутина, Л.В.Чернокозинская
Издательский дом "Вильяме".
101509, Москва, ул. Лесная, д. 43, стр. 1.
Подписано в печать 28.02.2005. Формат 70x100/16.
Гарнитура Times. Печать офсетная.
Усл. печ. л. 118.68 Уч.-изд. л. 86,19.
Тираж 3000 экз. Заказ № 859.
Отпечатано с диапозитивов в ФУГП "Печатный двор"
Министерства РФ по делам печати,
Телерадиовещания и средств массовых коммуникаций.
197110, Санкт-Петербург; Чкаловский пр. 15.


Рис. 12.2. Выпускные данные книги

       1. Автор (фамилия и имена (инициалы) или псевдоним каждого автора издания).
       2. Название (заглавие) издания.
       3. Номер тома (части, книги, выпуска).
       4. Вид издания (сборник, справочник, монография, сборник научных трудов, автореферат диссертации, энциклопедический словарь, учебное пособие и пр.).
       5. Тип издания (научное и научно-популярное издание, справочное и рекламное издание, учебное издание, литературно-художественное издание и пр.).
       6. Составители сборника произведений разных авторов (фамилия и имена(инициалы) каждого из составителей издания).
       7. Язык, с которого выполнен перевод издания.
       8. Переводчик (фамилия и инициалы каждого переводчика).
       9. Данные о лицах, принимавших участие в создании книги (редакторы, художники, корректоры и т.п.).
       10. Данные о повторности издания и его характеристики (стереотипное, исправленное, дополненное и т.п.): издание третье, дополненное и переработанное.
       11. Данные об утверждении издания в качестве учебника, учебного пособияили официального издания.
       12. Издательство (название и адрес издательства).
       13. Год выпуска издания.
       14. Макет аннотированной каталожной карточки.
       15. Международный стандартный номер книги (International Standard BookNumber, ISBN).
       16. Библиотечный шифр (например, ББК 32.973).
       17. Авторский знак (например, Д27).

       ISBN, библиотечный шифр и авторский знак используются при составлении каталогов и организации расстановки изданий на полках: по содержанию (в соответствии с библиотечным шифром) и алфавиту (в соответствии с авторским знаком).
       Международный стандартный номер книги состоит из аббревиатуры ISBN (независимо от языка издания) и десяти арабских цифр. Последняя цифра кода ISBN — контрольная и может быть римской цифрой X, используемой для обозначения числа 10. Цифровая часть кода ISBN состоит из четырех групп цифр, содержащих различное количество цифровых знаков, и отделяемых друг от друга дефисом. Группы цифр обозначают следующие данные: идентификатор страны, идентификатор издательства, порядковый номер книги, контрольная цифра.
       Библиотечно-библиографическая классификация (ББК) распределяет издания по отраслям знания в соответствии с их содержанием. В ней используются цифро-буквенные индексы ступенчатой структуры.
       Каждый из девяти классов (1. Марксизм-ленинизм; 2. Естественные науки; 3. Техника. Технические науки; 4. Сельское и лесное хозяйство; 5. Здравоохранение; 6/8. Общественные и гуманитарные науки; 9. Библиографические пособия. Справочные издания. Журналы.) расчленяется на подклассы и следующие ступени деления:

3. Техника. Технические науки.
   32 Радиоэлектроника.
     32.97 Вычислительная техника.
        32.973 Электронные вычислительные машины и устройства.
           32.973.2 Электронно-вычислительные машины и устройства дискретного действия.

       Шифр ББК используется при выделении хранимым изданиям определенных комнат, стеллажей и полок, а также для составления каталогов и статистических отчетов.
       Авторский знак, состоящий из первой буквы фамилии (псевдонима) автора или названия издания (для изданий без автора) и числа, соответствующего слогу, наиболее приближающегося по написанию к первым буквам фамилии (названия), упрощает расстановку книг на полках в алфавитном порядке.
       К объектам и атрибутам, позволяющим охарактеризовать отдельные экземпляры изданий, места их хранения и читателей, можно отнести:
       1. Номер комнаты (помещения для хранения экземпляров изданий).
       2. Номер стеллажа в комнате.
       3. Номер полки на стеллаже.
       4. Номер (инвентарный номер) экземпляра.
       5. Дата приобретения конкретного экземпляра.
       6. Дата списания конкретного экземпляра.
       7. Цена конкретного экземпляра.
       8. Фамилия читателя.
       9. Имя читателя.
       10. Отчество читателя.
       11. Адрес читателя.
       12. Телефон читателя.
       13. Дата выдачи читателю конкретного экземпляра.
       14. Срок, на который конкретный экземпляр выдан читателю.
       15. Дата возврата экземпляра.

12.2. Построение инфологической модели

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

Люди (Ид, Фамилия, Имя, Отчество, Псевдоним, Дата рождения, Пол, Адрес, Телефон)

       Эта сущность отводится для хранения сведений о читателях, а также всех людях, принимавших участие в подготовке и выпуске издания (авторах, составителях, редакторах, корректорах, переводчиках, художниках и пр.). Такое объединение допустимо, так как данные о разных людях выбираются из одного домена (фамилия, имя и пр.), оно исключает дублирование данных (один и тот же человек может быть читателем библиотеки и играть разные роли в подготовке разных изданий). Например, С.Я. Маршак писал стихи ("Сказка о глупом мышонке") и пьесы ("Двенадцать месяцев"), переводил Дж.Байрона, Р.Бернса, Г.Гейне и составлял сборники стихов.
       Так как фамилия и имена (инициалы) читателя библиотеки и (или) создателя могут быть достаточно громоздкими (М. Е. Салтыков-Щедрин, Франсуа Рене де Шатобриан, Остен Жюль Жан-Батист Ипполит и т.п.) и будут многократно встречаться в разных изданиях, то их целесообразно нумеровать и ссылаться на эти номера. Для этого вводится суррогатный ключ (см. разд. 2.4) — целочисленный атрибут ид, который будет автоматически наращиваться на единицу при вводе в базу данных нового автора, переводчика или другого создателя.
       Аналогично создаются суррогатные ключи для большинства сущностей модели рис. 12.3.

— Создатели (ИД, Наименование)

       Эта сущность отводится для хранения перечня ролей людей, принимающих участие в создании и выпуске книги: автор, переводчик, редактор, художник, корректор и т.п.


Рис. 12.3. Инфологическая модель базы данных "LIBRARY"

Издательства (ИД, Наименование, Адрес)

       Эта сущность фактически является кратким справочником издательств.

Заглавия (ИД, Наименование)

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

Виды_изданий (ИД, Наименование)

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

Типы_изданий (ИД, Наименование)

       Эта сущность отводится для хранения перечня типов изданий (научное и научно-популярное издание, справочное и рекламное издание, учебное издание, литературно-художественное издание и пр.).

Места (ИД, Номер_комнаты, Номер_стеллажа, Номер_полки)

       Одно из значений идентификатора (ид) этой сущности (например, -l) отведено для описания обобщенного места, находящегося за стенами хранилища книг (издание выдано читателю, временно передано другой библиотеке или организации).
       К ассоциативным сущностям можно отнести:

Издания, (ИД,"Заглавие_ид, Номер_тома, Авторский_знак, ББК, ISBN, Издательство_ид, Вид_издания_ид, Тип_издания_ид, Год_издания, Повторность, Макет_карточки)

       Сущность содержит основные сведения о конкретном издании со ссылками на данные Справочников Заглавия, Издательства, Виды_изданий, Типы_изданий И Участники.

Участники (Человек_ид, Создатель_ид, Издание_ид, Примечание)

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

Экземпляры (ИД, Издание_ид, Цена, Дата_преобретения, Дата_списания, Место_ид)

       Содержит сведения о дате приобретения конкретного экземпляра издания и его цене на момент приобретения, месте размещения экземпляра в библиотеке и дате списания экземпляра, если таковое произошло.

Выдачи (Человек_ид, Экземпляр_ид, Срок, Дата_выдачи, Дата_возврата)

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

12.3. Построение даталогической модели

       Теперь следует проверить, не нарушены ли в данном проекте какие-либо принципы нормализации (разд. 11.2), т.е. что любое неключевое поле каждой таблицы:
       — функционально зависит от полного первичного ключа, а не от его части(если ключ составной);
       — не имеет функциональной зависимости от другого неключевого поля.
       Сущности Люди, Создатели, Типы_изданий, Издательства, Виды_изданий, Заглавия и Места, состоящие из суррогатного ключа ид и не связанных между собой неключевых полей, безусловно нормализованы.
       Анализ ассоциативных сущностей издания и экземпляры, состоящих из суррогатного ключа ид и не связанных между собой неключевых полей, показал, что в них нет функциональных связей между неключевыми полями.
       И, наконец, анализ ассоциативных Сущностей Участники И Выдачи, состоящих из составного ключа и неключевых полей, показал, что в них также нет функциональных связей между неключевыми полями. Последние же не зависят функционально от какой-либо части составного ключа.
       Теперь перейдем к построению даталогической (табличной) модели.
       Для сокращения текста книги, приведем здесь описания ассоциативных сущностей и только трех стержневых: люди, создатели и места. Описания же остальных стержневых сущностей (Типы_изданий, Издательства, Виды_изданий и заглавия) практически не отличаются от, например, описания таблицы Создатели.
       В описаниях (листинги 12.1—12.7) будут использоваться предложения определения данных (Data Definition Language, DDL) языка SQL, подробно рассматриваемые в частях V и VI этой книги.

Листинг 12.1 Люди
-- Предложение для создания таблицы
CREATE TABLE ЛЮДИ (
    ИД               NUMBER (6,0) NOT NULL CONSTRAINT "ЛЮДИ_РК" PRIMARY KEY,
    ФАМИЛИЯ          NVARCHAR2(50) NOT NULL,
    ИМЯ              NVARCHAR2(50) NOT NULL,
    ОТЧЕСТВО         NVARCHAR2(50) NOT NULL,
    ПСЕВДОНИМ        NVARCHAR2(50),
    ДАТА_РОЖДЕНИЯ    DATE NOT NULL,
    ПОЛ              NCHAR(l) NOT NULL CONSTRAINT "Пол может быть М или Ж"
                     CHECK (ПОЛ IN ('М','Ж')),
    АДРЕС            NVARCHAR2(200),
    ТЕЛЕФОН          NVARCHAR2(50),
    CONSTRAINT "ЛЮДИ_ЦК" UNIQUE (ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО, ДАТА_РОЖДЕНИЯ, ПОЛ));
 
-- Комментарии для таблицы и ее столбцов
 
COMMENT ON TABLE ЛЮДИ IS 'Список читателей и/или создателей изданий';
COMMENT ON COLUMN ЛЮДИ.ИД IS 'Уникальный номер человека';
COMMENT ON COLUMN,ЛЮДИ.ФАМИЛИЯ IS 'Фамилия человека';
COMMENT ON COLUMN ЛЮДИ.ИМЯ IS 'Имя человека';
COMMENT ON COLUMN ЛЮДИ.ОТЧЕСТВО IS 'Отчество человека';
COMMENT ON COLUMN ЛЮДИ.ПСЕВДОНИМ IS 'Псевдоним человека';
COMMENT ON COLUMN ЛЮДИ.ДАТА_РОЖДЕНИЯ IS 'Дата рождения человека';
COMMENT ON COLUMN ЛЮДИ.ПОЛ IS 'Пол человека';
COMMENT ON COLUMN ЛЮДИ.АДРЕС IS 'Адрес человека';
COMMENT ON COLUMN ЛЮДИ.ТЕЛЕФОН IS 'Телефон человека';
 
-- Создание генератора уникальной последовательности значений, которые
-- будут использоваться в триггере ЛЮДИ_BIR для выработки значений
-- первичного ключа таблицы Люди
 
CREATE SEQUENCE ЛЮДИ_ПОСЛ INCREMENT BY 1 START WITH 1;
-- Создание триггера для выработки значений первичного ключа таблицы,
-- преобразования с помощью функции InitCap первых букв фамилии, имени и
-- отчества в прописные, а также ввода в столбец ДАТА_РОЖДЕНИЯ даты
-- 11.11.1111, если при вводе в него не вводилось никакого значения
 
CREATE OR REPLACE TRIGGER ЛЮДИ_BIR 
    BEFORE INSERT ON люди
    FOR EACH ROW
BEGIN
  SELECT ЛЮДИ_ПOCЛ.NEXTVAL INTO :new.ид FROM dual;
  :new.фамилия := InitCap(:new.фамилия);
  :new.имя := InitCap(:new.имя);
  :new.отчество := InitCap(:new.отчество);
IF :new.дата_рождения IS NULL THEN
   :new.дaтa_poждeния := to_date('11.11.1111','DD.MM.YYYY'); END IF;
END люди_bir;
 /
Листинг 12.2 Создатели
-- Предложение для создания таблицы
CREATE TABLE СОЗДАТЕЛИ (
ИД NUMBER(6,0) NOT NULL CONSTRAINT "СОЗДАТЕЛИ_РК" PRIMARY KEY,
НАИМЕНОВАНИЕ NVARCHAR2(200) NOT NULL,
CONSTRAINT "СО3ДАТЕЛИ_UK" UNIQUE (НАИМЕНОВАНИЕ));
-- Комментарии для таблицы и ее столбцов
COMMENT ON TABLE СОЗДАТЕЛИ IS 'Перечень создателей издания';
COMMENT ON COLUMN СОЗДАТЕЛИ.ИД IS 'Искусственный первичный уникальный идентификатор';
COMMENT ON COLUMN СОЗДАТЕЛИ.НАИМЕНОВАНИЕ IS 'Наименование создателя';
Создание генератора уникальной последовательности значений, которые
-- будут использоваться в триггере СОЗДАТЕЛИ_BIR для выработки значений
-- первичного ключа таблицы Создатели
CREATE SEQUENCE СО3ДАТЕЛИ_ПОСЛ INCREMENT BY 1 START WITH 1;
-- Создание триггера для выработки значений первичного ключа таблицы
CREATE OR REPLACE TRIGGER С03ДАТЕЛИ_BIR
BEFORE INSERT ON создатели FOR EACH ROW BEGIN
SELECT создатели_посл.NEXTVAL INTO :new.ид FROM dual;
end создатели_BIR;
/
Листинг 12.3 Места
-- Предложение для создания таблицы
CREATE TABLE МЕСТА (
ИД NUMBER(6,0) NOT NULL CONSTRAINT "MECTA_PK" PRIMARY KEY,
НОМЕР_КОМНАТЫ  NVARCHAR2(20) NOT NULL,
НОМЕР_СТЕЛЛАЖА NVARCHAR2(20) NOT NULL,
НОМЕР_ПОЛКИ    NVARCHAR2(20) NOT NULL,
CONSTRAINT "MECTA_UK" UNIQUE (НОМЕР_КОМНАТЫ, НОМЕР_СТЕЛЛАЖА, НОМЕР_ПОЛКИ));
-- Комментарии для таблицы и ее столбцов
COMMENT ON TABLE МЕСТА IS 'Перечень мест хранения экземпляров';
COMMENT ON COLUMN МЕСТА.ИД IS 'Искусственный первичный уникальный идентификатор';
COMMENT ON COLUMN МЕСТА.НОМЕР_КОМНАТЫ IS 'Номер комнаты';
COMMENT ON COLUMN МЕСТА.HOMEР_СТЕЛЛАЖА IS 'Номер стеллажа';
COMMENT ON COLUMN МЕСТА.HOMEР_ПОЛКИ IS 'Номер полки';
 
-- Создание генератора уникальной последовательности значений, которые
-- будут использоваться в триггере MECTA_BIR для выработки значений
-- первичного ключа таблицы Места
 
CREATE SEQUENCE МЕСТА_ПОСЛ INCREMENT BY 1 START WITH 1;
-- Создание триггера для выработки значений первичного ключа таблицы
CREATE OR REPLACE TRIGGER MECTA_BIR
BEFORE INSERT ON места FOR EACH ROW BEGIN
SELECT места_посл.NEXTVAL INTO :new.ид FROM dual;
end места_BIR;
/
Листинг 12.4 Издания
-- Предложение для создания таблицы
CREATE TABLE ИЗДАНИЯ (
ИД                NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАНИЯ_РК" PRIMARY KEY,
ЗАГЛАВИЕ_ИД       NUMBER(6,0) NOT NULL CONSTRAINT "ЗАГЛАВИЯ_РК" REFERENCES ЗАГЛАВИЯ (ИД),
HOMEP_TOMA        NVARCHAR2(10),
АВТОРСКИЙ_ЗНАК    NVARCHAR2(6) NOT NULL,
ББК&              NVARCHAR2(20) NOT NULL,
ISBN              NVARCHAR2(20) NOT NULL,
ИЗДАТЕЛЬСТВО_ИД   NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАТЕЛЬСТВА_РК" REFERENCES ИЗДАТЕЛЬСТВА (ИД),
ВИД_ИЗДАНИЯ_ИД    NUMBER (6,0) NOT NULL CONSTRAINT "ВИДЫ_ИЗДАНИЙ_РК" REFERENCES ВИДЫ_ИЗДАНИЙ (ИД),
ТИП_ИЗДАНИЯ_ИД    NUMBER (6,0) NOT NULL CONSTRAINT "ТИПЫ_ИЗДАНИЙ_РК" REFERENCES ТИПЫ_ИЗДАНИЙ (ИД),
ГОД__ИЗДАНИЯ      NUMBER (4,0) NOT NULL,
ПОВТОРНОСТЬ       NVARCHAR2(200),
МАКЕТ_КАРТОЧКИ    NVARCHAR2(4000),
CONSTRAINT "ИЗДАНИЯ_ЦК" UNIQUE (3АГЛАВИЕ_ИД, HOMEP_TOMA, АВТОРСКИЙ_ЗНАК, ББК, ISBN, ИЗДАТЕЛЬСТВО_ИД, 
                        ВИД_ИЗДАНИЯ_ИД, ТИП_ИЗДАНИЯ_ИД, ГОД_ИЗДАНИЯ, ПОВТОРНОСТЬ, МАКЕТ_КАРТОЧКИ)
);
 
-- Комментарии для таблицы и ее столбцов
COMMENT ON TABLE ИЗДАНИЯ IS 'Перечень изданий';
COMMENT ON COLUMN ИЗДАНИЯ.ИД IS 'Искусственный первичный уникальный идентификатор';
COMMENT ON COLUMN ИЗДАНИЯ.ЗАГЛАВИЕ_ИД IS 'Внешний ключ к таблице Заглавия';
COMMENT ON COLUMN ИЗДАНИЯ.НОМЕР_ТОМА IS 'Номер тома';
COMMENT ON COLUMN ИЗДАНИЯ.АВТОРСКИЙ_ЗНАК IS 'Авторский знак';
COMMENT ON COLUMN ИЗДАНИЯ.ББК IS 'Шифр библиотечно-библиографической классификации';
COMMENT ON COLUMN ИЗДАНИЯ.ISBN IS 'Международный стандартный номер книги';
COMMENT ON COLUMN ИЗДАНИЯ.ИЗДАТЕЛЬСТВ0_ИД IS 'Внешний ключ к таблице Издательства';
COMMENT ON COLUMN ИЗДАНИЯ.ВИД_ИЗДАНИЯ_ИД IS 'Внешний ключ к таблице Виды изданий';
COMMENT ON COLUMN ИЗДАНИЯ.ТИП_ИЗДАНИЯ_ИД IS 'Внешний ключ к таблице Типы изданий';
COMMENT ON COLUMN ИЗДАНИЯ.ГОД_ИЗДАНИЯ IS 'Год издания книги';
COMMENT ON COLUMN ИЗДАНИЯ.ПОВТОРНОСТЬ IS 'Повторность издания';
COMMENT ON COLUMN ИЗДАНИЯ.МАКЕТ_КАРТОЧКИ IS 'Макет аннотированной каталожной карточки';
 
-- Создание генератора уникальной последовательности значений, которые
-- будут использоваться в триггере ИЗДАНИЯ_BIR для выработки значений
-- первичного ключа таблицы Издания
 
CREATE SEQUENCE ИЗДАНИЯ_П0СЛ INCREMENT BY 1 START WITH 1;
--  Создание триггера для выработки значений первичного ключа таблицы
CREATE OR REPLACE TRIGGER ИЗДАНИЯ_BIR
BEFORE INSERT ON издания FOR EACH ROW BEGIN
SELECT издания_посл.NEXTVAL INTO :new.ид FROM dual;
end издания_BIR;
/
Листинг 12.5 Участники
--  Предложение для создания таблицы
CREATE TABLE УЧАСТНИКИ (
ЧЕЛОВЕК_ИД   NUMBER(6,0) NOT NULL CONSTRAINT "ЛЮДИ_РК" REFERENCES ЛЮДИ (ИД),
ИЗДАНИЕ_ИД   NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАНИЕ_ГК" REFERENCES ИЗДАНИЯ (ИД),
СО3ДАТЕЛЬ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "СОЗДАТЕЛИ_РК" REFERENCES СОЗДАТЕЛИ (ИД),
ПРИМЕЧАНИЕ   NVARCHAR2(200),
CONSTRAINT "УЧАСТНИКИ_РК" PRIMARY KEY (ИЗДАНИЕ_ИД, С03ДАТЕЛЬ_ИД, ЧЕЛОВЕК_ВД)
);
 
-- Комментарии для таблицы и ее столбцов
COMMENT ON TABLE УЧАСТНИКИ IS 'Люди, принимавшие участие в создании издания';
COMMENT ON COLUMN УЧАСТНИКИ.ЧЕЛОВЕК_ИД IS 'Внешний ключ к таблице Люди';
COMMENT ON COLUMN УЧАСТНИКИ.ИЗДАНИЕ_ИД IS 'Внешний ключ к таблице Издания';
COMMENT ON COLUMN УЧАСТНИКИ.СО3ДАТЕЛЬ_ИД IS 'Внешний ключ к таблице Создатели';
COMMENT ON COLUMN УЧАСТНИКИ.ПРИМЕЧАНИЕ IS 'Примечание';
Листинг 12.6 Экземпляры
-- Предложение для создания таблицы
CREATE TABLE ЭКЗЕМПЛЯРЫ (
ИД          NUMBER(6,0) NOT NULL CONSTRAINT "ЭКЗЕМПЛЯРЫ_РК" PRIMARY KEY,
ИЗДАНИЕ_ИД  NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАНИЯ_FК" REFERENCES ИЗДАНИЯ (ИД),
МЕСТО_ИД    NUMBER(6,0) NOT NULL CONSTRAINT "MECTA_FK" REFERENCES МЕСТА (ИД),
ДАТА_ПРЕОБРЕТЕНИЯ DATE NOT NULL, 
ЦЕНА              NUMBER(9,2) NOT NULL, 
ДАТА_СПИСАНИЯ     DATE,
CONSTRAINT "ЭКЗЕМПЛЯРЫ_UK" UNIQUE (ИЗДАНИЕ_ИД, МЕСТО_ИД, ДАТА_ПРЕОБРЕТЕНИЯ, ЦЕНА)
);
 
-- Описания назначения таблицы и ее столбцов
COMMENT ON TABLE ЭКЗЕМПЛЯРЫ IS 'Перечень экземпляров';
COMMENT ON COLUMN ЭКЗЕМПЛЯРЫ.ИД IS 'Искусственный первичный уникальный идентификатор';
COMMENT ON COLUMN ЭКЗЕМПЛЯРЫ.ИЗДАНИЕ_ИД IS  'Внешний ключ к таблице Издания';
COMMENT ON COLUMN ЭКЗЕМПЛЯРЫ.МЕСТО_ИД  IS   'Внешний ключ к таблице Места';
COMMENT ON COLUMN ЭКЗЕМПЛЯРЫ.ДАТА_ПРЕОБРЕТЕНИЯ IS 'Дата преобретения экземпляра ';
COMMENT ON COLUMN ЭКЗЕМПЛЯРЫ.ЦЕНА IS 'Цена экземпляра';
COMMENT ON COLUMN ЭКЗЕМПЛЯРЫ.ДАТА_СПИСАНИЯ IS 'Дата списания экземпляра';
 
-- Создание генератора уникальной последовательности значений, которые
-- будут использоваться в триггере ЭКЗЕМПЛЯРЫ_BIR для выработки значений
-- первичного ключа таблицы Экземпляры
 
CREATE SEQUENCE ЭКЗЕМПЛЯРЫ_ПОСЛ INCREMENT BY 1 START WITH 1;
-- Создание триггера для выработки значений первичного ключа таблицы
 
CREATE OR REPLACE TRIGGER ЭКЗЕМПЛЯРЫ_BIR
BEFORE INSERT ON экземпляры FOR EACH ROW BEGIN
SELECT экземпляры_посл.NEXTVAL INTO :new.ид FROM dual;
end экземпляры_BIR;
/
Листинг 12.7 Выдачи
-- Предложение для создания таблицы
 
CREATE TABLE ВЫДАЧИ (
ЧЕЛОВЕК_ИД   NUMBER(6,0) NOT NULL CONSTRAINT "ЛЮДИ_ВЫДАЧИ_РК" REFERENCES ЛЮДИ (ИД),
ЭКЗЕМПЛЯР_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ЭКЗЕМПЛЯРЫ_РК" REFERENCES ЭКЗЕМПЛЯРЫ (ИД),
СРОК         NUMBER(3,0) NOT NULL,
ДАТА_ВЫДАЧИ  DATE DEFAULT sysdate NOT NULL,
ДАТА_В03ВРАТА DATE,
CONSTRAINT "ВЫДАЧИ_UK" UNIQUE (ЭКЗЕМПЛЯР_ИД, ЧЕЛОВЕК_ИД, ДАТА_ВЫДАЧИ));
 
-- Комментарии для таблицы и ее столбцов
COMMENT ON TABLE ВЫДАЧИ IS 'Читательские билеты';
COMMENT ON COLUMN ВЫДАЧИ.ЧЕЛОВЕК_ИД IS 'Внешний ключ к таблице Люди';
COMMENT ON COLUMN ВЫДАЧИ.ЭКЗЕМПЛЯР_ИД IS 'Внешний ключ к таблице Экземпляры';
COMMENT ON COLUMN ВЫДАЧИ.СРОК IS 'Срок, на который выдан экземпляр (в днях)';
COMMENT ON COLUMN ВЫДАЧИ.ДАТА_ВЫДАЧИ IS 'Дата выдачи экземпляра';
COMMENT ON COLUMN ВЫДАЧИ.ДАТА_ВО3ВPATA IS 'Дата возврата экземпляра';

 





Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:56 MSK


Постоянный адрес статьи:
http://az-design.ru/Projects/AzBook/Review/Kirillov_ch12.shtml