Кириллов В.В., Громов Г.Ю. - Введение в реляционные базы данных. Литература для вузов isbn 9785941577705 в книге рассматриваются основные понятия баз данных и систем управления ими
Скачать 11.62 Mb.
|
Глава 12 Пример проектирования базы данных "LIBRARY" 12.1. Назначение и предметная область База данных предназначена для хранения данных о приобретенных библио- текой изданиях (монографиях, справочниках, сборниках статей и т. п.), ин- формации о местонахождении отдельных экземпляров каждого издания и сведений о читателях. Для ведения библиотечных каталогов, организации поиска требуемых изданий и библиотечной статистики в базе должны храниться сведения, большая часть которых размещаются в аннотированных каталожных карточках (рис. 12.1). Д27 Дейт К. Дж. Введение в системы баз данных, 8 - е издание.: Пер. с англ. — М.: Издательский дом "Вильямс", 2005. — 1328 с.: ил. — Парал. тит. англ. ISBN 5-8459-0788- 8 (рус.) Новое издание фундаментального труда Криса Дейта представляет собой ис- черпывающее введение в очень обширную в настоящее время теорию систем баз данных. С помощью этой книги читатель сможет приобрести фундамен- тальные знания в области технологии баз данных, а также ознакомиться с на- правлениями, по которым рассматриваемая сфера деятельности, вероятно, будет развиваться в будущем. Книга предназначена для использования в основ- ном в качестве учебника, а не справочника, и поэтому, несомненно, вызовет интерес у программистов - профессионалов, научных работников и студентов, изучающих соответствующие курсы в высших учебных заведениях. В ней сде- лан акцент на усвоении сути и глубоком понимании излагаемого материала, а не просто на его формальном изложении. Книга, безусловно, будет полезна всем, кому приходится работать с базами данных или просто пользоваться ими. ББК 32.973.26 -018.2.75 Рис. 12.1. Макет аннотированной каталожной карточки Глава 12. Пример проектирования базы данных "LIBRARY" 225 Анализ запросов на литературу показал, что для поиска подходящих изданий (по тематике, автору, художнику, издательству и т. п.) и отбора нужного (на- пример, по аннотации) необходимо выделить следующие атрибуты каталож- ной карточки, а также выпускных данных книги (рис. 12.2): 1. Автор (фамилия и имена (инициалы) или псевдоним каждого автора из- дания). 2. Название (заглавие) издания. Научно-популярное издание К.Дж. Дейт Введение в системы баз данных 8-е издание Литературный редактор С.Г. Татаренко Верстка М.А. Смолина Художественный редактор С.А. Чернокозинский Корректоры З.В. Александрова, Л.А. Гордиенко, О.В. Мишутина, Л.В. Чернокозинская Издательский дом "Вильямс". 101509, Москва, ул. Лесная, д. 43, стр. 1. Подписано в печать 28.02.2005. Формат 70x100/16. Гарнитура Times. Печать офсетная. Усл. печ. л. 118.68 Уч.-изд. л. 86,19. Тираж 3000 экз. Заказ № 859. Отпечатано с диапозитивов в ФУГП "Печатный двор" Министерства РФ по делам печати, Телерадиовещания и средств массовых коммуникаций. 197110, Санкт-Петербург, Чкаловский пр. 15. Рис. 12.2. Выпускные данные книги Часть IV. Основы проектирования баз данных 226 3. Номер тома (части, книги, выпуска). 4. Вид издания (сборник, справочник, монография, сборник научных тру- дов, автореферат диссертации, энциклопедический словарь, учебное по- собие и пр.). 5. Тип издания (научное и научно-популярное издание, справочное и реклам- ное издание, учебное издание, литературно-художественное издание и пр.). 6. Составители сборника произведений разных авторов (фамилия и имена (инициалы) каждого из составителей издания). 7. Язык, с которого выполнен перевод издания. 8. Переводчик (фамилия и инициалы каждого переводчика). 9. Данные о лицах, принимавших участие в создании книги (редакторы, ху- дожники, корректоры и т. п.). 10. Данные о повторности издания и его характеристики (стереотипное, ис- правленное, дополненное и т. п.): издание третье, дополненное и перера- ботанное. 11. Данные об утверждении издания в качестве учебника, учебного пособия или официального издания. 12. Издательство (название и адрес издательства). 13. Год выпуска издания. 14. Макет аннотированной каталожной карточки. 15. Международный стандартный номер книги (International Standard Book Number, ISBN). 16. Библиотечный шифр (например, ББК 32.973). 17. Авторский знак (например, Д27). ISBN, библиотечный шифр и авторский знак используются при составлении каталогов и организации расстановки изданий на полках: по содержанию (в соответствии с библиотечным шифром) и алфавиту (в соответствии с ав- торским знаком). Международный стандартный номер книги состоит из аббревиатуры ISBN (независимо от языка издания) и десяти арабских цифр. Последняя цифра кода ISBN — контрольная и может быть римской цифрой X, используемой для обозначения числа 10. Цифровая часть кода ISBN состоит из четырех групп цифр, содержащих различное количество цифровых знаков, и отделяе- мых друг от друга дефисом. Группы цифр обозначают следующие данные: идентификатор страны, идентификатор издательства, порядковый номер кни- ги, контрольная цифра. Глава 12. Пример проектирования базы данных "LIBRARY" 227 Библиотечно-библиографическая классификация (ББК) распределяет издания по отраслям знания в соответствии с их содержанием. В ней используются цифро-буквенные индексы ступенчатой структуры. Каждый из девяти классов (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. Адрес читателя. Часть IV. Основы проектирования баз данных 228 12. Телефон читателя. 13. Дата выдачи читателю конкретного экземпляра. 14. Срок, на который конкретный экземпляр выдан читателю. 15. Дата возврата экземпляра. 12.2. Построение инфологической модели Анализ определенных ранее объектов и атрибутов позволяет выделить сущ- ности проектируемой базы данных и, приняв решение о создании реляцион- ной базы данных, построить ее инфологическую модель (рис. 12.3). К стержневым сущностям можно отнести: Люди (Ид, Фамилия, Имя, Отчество, Псевдоним, Дата рождения, Пол, Адрес, Телефон) Эта сущность отводится для хранения сведений о читателях, а также всех людях, принимавших участие в подготовке и выпуске издания (авторах, составителях, редакторах, корректорах, переводчиках, художниках и пр.). Такое объединение допустимо, так как данные о разных людях выбирают- ся из одного домена (фамилия, имя и пр.), оно исключает дублирование данных (один и тот же человек может быть читателем библиотеки и иг- рать разные роли в подготовке разных изданий). Например, С. Я. Маршак писал стихи ("Сказка о глупом мышонке") и пьесы ("Двенадцать месяцев"), переводил Дж. Байрона, Р. Бернса, Г. Гейне и составлял сборники стихов. Так как фамилия и имена (инициалы) читателя библиотеки и (или) созда- теля могут быть достаточно громоздкими (М. Е. Салтыков-Щедрин, Франсуа Рене де Шатобриан, Остен Жюль Жан-Батист Ипполит и т. п.) и будут многократно встречаться в разных изданиях, то их целесообразно нумеровать и ссылаться на эти номера. Для этого вводится суррогатный ключ (см. разд. 2.4) — целочисленный атрибут Ид , который будет автома- тически наращиваться на единицу при вводе в базу данных нового автора, переводчика или другого создателя. Аналогично создаются суррогатные ключи для большинства сущностей модели рис. 12.3. Создатели (ИД, Наименование) Эта сущность отводится для хранения перечня ролей людей, принимаю- щих участие в создании и выпуске книги: автор, переводчик, редактор, художник, корректор и т. п. Глава 12. Пример проектирования базы данных "LIBRARY" 229 ЭКЗЕМПЛЯРЫ ИД ИЗДАНИЕ_ИД МЕСТО_ИД ДАТА_ПРЕОБРЕТЕНИЯ ЦЕНА ДАТА_СПИСАНИЯ ИЗДАТЕЛЬСТВА ИД НАИМЕНОВАНИЕ АДРЕС ЛЮДИ ИД ФАМИЛИЯ ИМЯ ОТЧЕСТВО ПСЕВДОНИМ ДАТА_РОЖДЕНИЯ ПОЛ АДРЕС ТЕЛЕФОН ВИДЫ_ИЗДАНИЙ ИД НАИМЕНОВАНИЕ ВЫДАЧИ ЧЕЛОВЕК_ИД ЭКЗЕМПЛЯР_ИД СРОК ДАТА_ВЫДАЧИ ДАТА_ВОЗВРАТА МЕСТА ИД НОМЕР_КОМНАТЫ НОМЕР_СТЕЛЛАЖА НОМЕР_ПОЛКИ ЗАГЛАВИЯ ИД НАИМЕНОВАНИЕ ИЗДАНИЯ ИД ЗАГЛАВИЕ_ИД НОМЕР_ТОМА АВТОРСКИЙ_ЗНАК ББК ISBN ИЗДАТЕЛЬСТВО_ИД ВИД_ИЗДАНИЯ_ИД ТИП_ИЗДАНИЯ_ИД ГОД_ИЗДАНИЯ ПОВТОРНОСТЬ МАКЕТ_КАРТОЧКИ СОЗДАТЕЛИ ИД НАИМЕНОВАНИЕ ТИПЫ_ИЗДАНИЙ ИД НАИМЕНОВАНИЕ УЧАСТНИКИ ЧЕЛОВЕК_ИД ИЗДАНИЕ_ИД СОЗДАТЕЛЬ_ИД ПРИМЕЧАНИЕ Рис. 12.3. Инфологическая модель базы данных "LIBRARY" Издательства (ИД, Наименование, Адрес) Эта сущность фактически является кратким справочником издательств. Заглавия (ИД, Наименование) Выделение этой сущности позволит сократить объем данных и снизить вероятность возникновения противоречивости (исключается необходи- мость ввода длинных текстовых названий для различных томов собраний сочинений, повторных изданий, учебников и т. п.). Виды_изданий (ИД, Наименование) Эта сущность отводится для хранения перечня видов изданий (сборник, справочник, монография, сборник научных трудов, автореферат диссерта- ции, энциклопедический словарь, учебное пособие и пр.). Часть IV. Основы проектирования баз данных 230 Типы_изданий (ИД, Наименование) Эта сущность отводится для хранения перечня типов изданий (научное и научно-популярное издание, справочное и рекламное издание, учебное издание, литературно-художественное издание и пр.). Места (ИД, Номер_комнаты, Номер_стеллажа, Номер_ полки) Одно из значений идентификатора ( Ид ) этой сущности (например, -1 ) от- ведено для описания обобщенного места, находящегося за стенами храни- лища книг (издание выдано читателю, временно передано другой библио- теке или организации). К ассоциативным сущностям можно отнести: Издания (ИД, Заглавие_ид, Номер_тома, Авторский_знак, ББК, ISBN, Издательство_ид, Вид_издания_ид, Тип_издания_ид, Год_издания, По- вторность, Макет_карточки) Сущность содержит основные сведения о конкретном издании со ссылка- ми на данные справочников Заглавия , Издательства , Виды_изданий , Типы_ изданий и Участники Участники (Человек_ид, Создатель_ид, Издание_ид, Примечание) Содержит ссылки на всех лиц, принимавших участие в подготовке и (или) выпуске конкретного издания, с указанием всех их ролей в этой деятельности. Экземпляры (ИД, Издание_ид, Цена, Дата_преобретения, Дата_ списания, Место_ид) Содержит сведения о дате приобретения конкретного экземпляра издания и его цене на момент приобретения, месте размещения экземпляра в биб- лиотеке и дате списания экземпляра, если таковое произошло. Выдачи (Человек_ид, Экземпляр_ид, Срок, Дата_выдачи, Дата_возврата) Если не пытаться сокращать названия сущностей и создаваемых по ним таб- лиц, то Выдачи надо было бы назвать "Библиотечный абонемент", предостав- ляющий читателю (с номером ИД ) право получить экземпляр издания для ра- боты с ним в читальном зале или в любом месте на определенный срок. 12.3. Построение даталогической модели Теперь следует проверить, не нарушены ли в данном проекте какие-либо принципы нормализации (разд. 11.2), т. е. что любое неключевое поле каж- дой таблицы: функционально зависит от полного первичного ключа, а не от его части (если ключ составной); не имеет функциональной зависимости от другого неключевого поля. Глава 12. Пример проектирования базы данных "LIBRARY" 231 Сущности Люди , Создатели , Типы_изданий , Издательства , Виды_изданий , Заглавия и Места , состоящие из суррогатного ключа ИД и не связанных меж- ду собой неключевых полей, безусловно нормализованы. Анализ ассоциативных сущностей Издания и Экземпляры , состоящих из сур- рогатного ключа ИД и не связанных между собой неключевых полей, показал, что в них нет функциональных связей между неключевыми полями. И наконец, анализ ассоциативных сущностей Участники и Выдачи , состоящих из составного ключа и неключевых полей, показал, что в них также нет функциональных связей между неключевыми полями. Последние же не зави- сят функционально от какой-либо части составного ключа. Теперь перейдем к построению даталогической (табличной) модели. Для сокращения текста книги, приведем здесь описания ассоциативных сущ- ностей и только трех стержневых: Люди , Создатели и Места . Описания же ос- тальных стержневых сущностей ( Типы_изданий , Издательства , Виды_изданий и Заглавия ) практически не отличаются от, например, описания таблицы Создатели В описаниях (листинги 12.1—12.7) будут использоваться предложения опре- деления данных (Data Definition Language, DDL) языка SQL, подробно рас- сматриваемые в частях V и VI этой книги. Листинг 12.1. Люди -- Предложение для создания таблицы -- CREATE TABLE ЛЮДИ ( ИД NUMBER(6,0) NOT NULL CONSTRAINT "ЛЮДИ_PK" PRIMARY KEY, ФАМИЛИЯ NVARCHAR2(50) NOT NULL, ИМЯ NVARCHAR2(50) NOT NULL, ОТЧЕСТВО NVARCHAR2(50) NOT NULL, ПСЕВДОНИМ NVARCHAR2(50), ДАТА_РОЖДЕНИЯ DATE NOT NULL, ПОЛ NCHAR(1) NOT NULL CONSTRAINT "Пол может быть М или Ж" CHECK (ПОЛ IN ('М','Ж')), АДРЕС NVARCHAR2(200), ТЕЛЕФОН NVARCHAR2(50), CONSTRAINT "ЛЮДИ_UK" UNIQUE (ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО, ДАТА_РОЖДЕНИЯ, ПОЛ) ); Часть IV. Основы проектирования баз данных 232 -- Комментарии для таблицы и ее столбцов -- 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 ЛЮДИ_ПОСЛ.NEXTVAL INTO :new.ид FROM dual; :new.фамилия := InitCap(:new.фамилия); :new.имя := InitCap(:new.имя); :new.отчество := InitCap(:new.отчество); IF :new.дата_рождения IS NULL THEN :new.дата_рождения := to_date('11.11.1111','DD.MM.YYYY'); END IF; END люди_bir; / Глава 12. Пример проектирования базы данных "LIBRARY" 233 Листинг 12.2. Создатели -- Предложение для создания таблицы -- CREATE TABLE СОЗДАТЕЛИ ( ИД NUMBER(6,0) NOT NULL CONSTRAINT "СОЗДАТЕЛИ_PK" PRIMARY KEY, НАИМЕНОВАНИЕ NVARCHAR2(200) NOT NULL, CONSTRAINT "СОЗДАТЕЛИ_UK" UNIQUE (НАИМЕНОВАНИЕ) ); -- Комментарии для таблицы и ее столбцов -- COMMENT ON TABLE СОЗДАТЕЛИ 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.3. Места -- Предложение для создания таблицы -- CREATE TABLE МЕСТА Часть IV. Основы проектирования баз данных 234 ( ИД NUMBER(6,0) NOT NULL CONSTRAINT "МЕСТА_PK" PRIMARY KEY, НОМЕР_КОМНАТЫ NVARCHAR2(20) NOT NULL, НОМЕР_СТЕЛЛАЖА NVARCHAR2(20) NOT NULL, НОМЕР_ПОЛКИ NVARCHAR2(20) NOT NULL, CONSTRAINT "МЕСТА_UK" UNIQUE (НОМЕР_КОМНАТЫ, НОМЕР_СТЕЛЛАЖА, НОМЕР_ПОЛКИ) ); -- Комментарии для таблицы и ее столбцов -- COMMENT ON TABLE МЕСТА 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.4. Издания -- Предложение для создания таблицы -- CREATE TABLE ИЗДАНИЯ ( Глава 12. Пример проектирования базы данных "LIBRARY" 235 ИД NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАНИЯ_PK" PRIMARY KEY, ЗАГЛАВИЕ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ЗАГЛАВИЯ_FK" REFERENCES ЗАГЛАВИЯ (ИД), НОМЕР_ТОМА NVARCHAR2(10), АВТОРСКИЙ_ЗНАК NVARCHAR2(6) NOT NULL, ББК NVARCHAR2(20) NOT NULL, ISBN NVARCHAR2(20) NOT NULL, ИЗДАТЕЛЬСТВО_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАТЕЛЬСТВА_FK" REFERENCES ИЗДАТЕЛЬСТВА (ИД), ВИД_ИЗДАНИЯ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ВИДЫ_ИЗДАНИЙ_FK" REFERENCES ВИДЫ_ИЗДАНИЙ (ИД), ТИП_ИЗДАНИЯ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ТИПЫ_ИЗДАНИЙ_FK" REFERENCES ТИПЫ_ИЗДАНИЙ (ИД), ГОД_ИЗДАНИЯ NUMBER(4,0) NOT NULL, ПОВТОРНОСТЬ NVARCHAR2(200), МАКЕТ_КАРТОЧКИ NVARCHAR2(4000), CONSTRAINT "ИЗДАНИЯ_UK" UNIQUE (ЗАГЛАВИЕ_ИД, НОМЕР_ТОМА, АВТОРСКИЙ_ЗНАК, ББК, 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 ИЗДАНИЯ.ИЗДАТЕЛЬСТВО_ИД IS 'Внешний ключ к таблице Издательства'; COMMENT ON COLUMN ИЗДАНИЯВИД_ИЗДАНИЯ_ИД IS 'Внешний ключ к таблице Виды изданий'; COMMENT ON COLUMN ИЗДАНИЯ.ТИП_ИЗДАНИЯ_ИД IS 'Внешний ключ к таблице Типы изданий'; COMMENT ON COLUMN ИЗДАНИЯ.ГОД_ИЗДАНИЯ IS 'Год издания книги'; COMMENT ON COLUMN ИЗДАНИЯ.ПОВТОРНОСТЬ IS 'Повторность издания'; Часть IV. Основы проектирования баз данных 236 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.5. Участники -- Предложение для создания таблицы -- CREATE TABLE УЧАСТНИКИ ( ЧЕЛОВЕК_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ЛЮДИ_FK" REFERENCES ЛЮДИ (ИД), ИЗДАНИЕ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАНИЕ_FK" REFERENCES ИЗДАНИЯ (ИД), СОЗДАТЕЛЬ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "СОЗДАТЕЛИ_FK" REFERENCES СОЗДАТЕЛИ (ИД), ПРИМЕЧАНИЕ NVARCHAR2(200), CONSTRAINT "УЧАСТНИКИ_PK" PRIMARY KEY (ИЗДАНИЕ_ИД, СОЗДАТЕЛЬ_ИД, ЧЕЛОВЕК_ИД) ); -- Комментарии для таблицы и ее столбцов -- COMMENT ON TABLE УЧАСТНИКИ IS 'Люди, принимавшие участие в создании издания'; Глава 12. Пример проектирования базы данных "LIBRARY" 237 COMMENT ON COLUMN УЧАСТНИКИ.ЧЕЛОВЕК_ИД IS 'Внешний ключ к таблице Люди'; COMMENT ON COLUMN УЧАСТНИКИ.ИЗДАНИЕ_ИД IS 'Внешний ключ к таблице Издания'; COMMENT ON COLUMN УЧАСТНИКИ.СОЗДАТЕЛЬ_ИД IS 'Внешний ключ к таблице Создатели'; COMMENT ON COLUMN УЧАСТНИКИ.ПРИМЕЧАНИЕ IS 'Примечание'; Листинг 12.6. Экземпляры -- Предложение для создания таблицы -- CREATE TABLE ЭКЗЕМПЛЯРЫ ( ИД NUMBER(6,0) NOT NULL CONSTRAINT "ЭКЗЕМПЛЯРЫ_PK" PRIMARY KEY, ИЗДАНИЕ_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ИЗДАНИЯ_FK" REFERENCES ИЗДАНИЯ (ИД), МЕСТО_ИД NUMBER(6,0) NOT NULL CONSTRAINT "МЕСТА_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 для выработки значений -- первичного ключа таблицы Экземпляры -- Часть IV. Основы проектирования баз данных 238 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 "ЛЮДИ_ВЫДАЧИ_FK" REFERENCES ЛЮДИ (ИД), ЭКЗЕМПЛЯР_ИД NUMBER(6,0) NOT NULL CONSTRAINT "ЭКЗЕМПЛЯРЫ_FK" REFERENCES ЭКЗЕМПЛЯРЫ (ИД), СРОК NUMBER(3,0) NOT NULL, ДАТА_ВЫДАЧИ DATE DEFAULT sysdate 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 'Дата возврата экземпляра'; |