Вы находитесь на странице: 1из 54

Правительство Российской Федерации

Федеральное государственное автономное образовательное учреждение


высшего профессионального образования

«Национальный исследовательский университет


«Высшая школа экономики»

Факультет бизнеса и менеджмента, направление «Бизнес-информатика»

КУРСОВАЯ РАБОТА
на тему: «Проектирование базы данных для мониторинга деятельности
публичной библиотеки»

Студент группы ББИ 163


Гильманова Венера
Миневагизовна

Преподаватель
Поляков Игорь
Викторович,
доцент: Факультет бизнеса и
менеджмента/Кафедра
бизнес-аналитики

Москва, 2018 год


Аннотация
Данная работа представляет собой доклад о создании и разработке базы
данных для мониторинга деятельности публичной библиотеки. Главная задача
– показать умения в воплощении БД на заданную тему, в реконструкции
работы библиотеки на модели и связях между ними. В процессе работы была
создана база данных для разных процессов: обработка выдачи и возврата книг,
хранение информации о книгах, обработка штрафа, пропускная система и
пропускная система в читальные залы, хранение информации о читателях и
персонале. Включение данных процессов в базу данных сильно упростит
работу с огромным количеством заданий, информации и общей организации.
Для создания базы данных были задействованы соответствующие
программы и технические средства. Данная БД может быть использована для
создания сайта публичной библиотеки, где различные пользователи могут
работать с ней.
В работе имеются теоретические описания создания базы данных,
описание необходимых требований и сущностей БД, запросы. Для
подтверждения работы приведены снимки экрана с диаграммами, таблицы,
модели и прочие составляющие анализа базы данных.
В заключении содержаться выводы о проделанной работе.

Ключевые слова
База данных, SQL, SQL Server, Публичная библиотека, Проектирование
базы данных для мониторинга деятельности публичной библиотеки.

2
Оглавление
Аннотация ................................................................................................................ 2
Ключевые слова ....................................................................................................... 2
Введение ................................................................................................................... 4
Глава 1. Теоретические основы. ............................................................................ 7
Глава 2. Постановка задачи и предметная область ............................................. 9
Глава 3. Практическая реализация ...................................................................... 11
Заключение ............................................................................................................ 53
Список литературы ............................................................................................... 54

3
Введение
Актуальность
На данный момент многие учреждения стараются перейти на
компьютеризированное хранение информации, ведь поиск информации
должен быть быстрым и эффективным, точным и полным. Также, следуя
логике данного решения, учреждениям важно переходить на онлайн ресурсы,
дабы идти в ногу со временем. Это невозможно без баз данных, которые
заменят постоянную утерю информации, неточные данные, долгие поиски
нужного на быстрый поиск в один клик с точно найденной информацией.
Человеческих ресурсов недостаточно для того, чтобы обеспечить такие
сложные операции за такое быстрое время, учитывая, что потоки информации
увеличиваются с каждым днем. Особенно, это касается библиотек, а
конкретнее публичных, ведь они являются наиболее посещаемыми людьми
разных интересов и возрастов.
Каждое учреждение – это система, которая всегда имеет три основных
компонента: персонал, данные и клиенты. В данном случае персонал – это
библиотекари и технический персонал, данные – это книги, клиенты – это
читатели. Для слаженного процесса работы публичной библиотеки
необходима база данных, которая правильно соединит эти компоненты между
собой. В будущей БД не только должна будет содержаться информация о
книгах, как бы это показалось в начале, но и информация о персонале,
читателях, расположении книг, пропусках, штрафах и так далее. Мониторинг
деятельности заключает в себе полный спектр жизни библиотеки со всех ее
сторон.
Оптимальная база данных – это основа функционирующей системы,
именно поэтому ее необходимо рассматривать с точки зрения конкретных
пользователей, роли которых определяют их функционал. Для читателя
основным функционалом будет являться поиск книг по категориям или по
названиям, в то время как у администратора будет возможность управлять
базой данных в полной мере, тем самым обеспечивая конфиденциальность
4
данных работников и других читателей. Также, важной частью является
быстрота обработки запроса, ведь это главное преимущество базы данных над
другими видами хранения информации.
В целом, актуальность базы данных очевидна – она позволяет хранить,
обрабатывать и передавать информацию, не затрачивая при этом огромные
ресурсы.
Объект исследования: публичная библиотека;
Предмет исследования: деятельность публичной библиотеки,
структура связей компонентов между собой в процессе деятельности и сами
процессы.
Цель исследования: проектирование и создание базы данных для
эффективной деятельности публичной библиотеки.

Задачи исследования:
1. Проектирование базы данных для публичной библиотеки;
2. Создание базы данных, сущностей и связей, соответствующих
реальной модели библиотеки.
3. Разработка запросов для расширения функций базы данных;
4. Откладка работоспособности базы данных и ее компонентов.
5. Составление документации, описание базы данных.

Методы и технологии
В процессе создания и проектирования базы данных мною были
использованы следующие технические и программные средства:
1. ПК, отвечающим системным требованиям нижеперечисленных
программ;
2. CA ERwin Data Modeler v.9.6 – программное средство логического и
физического проектирования базы данных;
3. MySQL Workbench – инструмент для визуального проектирования баз
5
данных, объединяющий в себе проектирование, моделирование,
создание и эксплуатацию баз данных.
4. Microsoft SQL Server 2014 – реляционная СУБД, используемая для
создания баз данных, сущностей, связей и запросов.

Краткое содержание
В нижеследующих главах пройдет полный анализ, который будет в себя
включать рассмотрение теории и практики создания базы данных. Будут
рассмотрены теоретическая основа, постановка задачи и предметная область и
будет показана поэтапная реализация базы данных. В заключении будут
сделаны выводы о проделанной работе, прикреплена использованная
литература.

6
Глава 1. Теоретические основы.
Что такое база данных? База данных — это совокупность связанных
данных, расположенных по правилам, предполагающим общие принципы
описания, хранения, управления.
Как спроектировать и создать базу данных? В разработке баз данных
выделяют три основных этапа:
1. концептуальное проектирование – сбор, анализ и поправка
требований к данным;
2. логическое проектирование – изменение требований к данным в
структуры данных;
3. физическое проектирование – определение особенностей хранения
данных, методов доступа;
Существуют различные виды представления данных в базах данных,
такие как сетевые, иерархические, многомерные, дедуктивные и так далее. В
данной работе будет использоваться реляционная модель, так как она обладает
рядом преимуществ: вся информация заключена в таблицы, а таблицы связаны
между собой, что делает представление информации логическим и наглядным.
Как правильно построить таблицы? Выделяют ряд принципов, которыми
следует руководствоваться для эффективной модели базы данных:
1. Данные в таблицах не должны повторяться. Это избавляет от
несовпадения данных в различных таблицах, что значит изменять
информацию можно только в одном месте.
2. В таблицах нужно делать необходимые поля. Вся информация
должна соответствовать теме таблицы.
3. У базы данных должен быть primary key. Данный принцип
необходим связи разных таблиц между собой.
4. У таблицы может быть единственная тема. Это облегчает
обработку информации, например, во время удаления.
5. Таблицы должны иметь уникальные имена, а поля должны иметь
7
уникальные имена внутри таблиц.
Очень важен этап нормализации таблиц. Он позволяет получить такую
модель, где можно внедрять необходимые расширения. Существует три вида
нормальных форм: 1NF, 2NF и 3NF. Первая нормальная форма предполагает
неделимость значения в каждом поле строки. Вторая нормальная форма
предполагает независимость primary key от foreign key. Третья нормальная
форма предполагает независимость неключевых полей от иных ключевых
полей. Каждую таблицу необходимо привести хотя бы к третьей нормальной
форме.
После создания таблиц и перед вводом необходимых данных, для
обеспечения целостности хранения и будущего заполнения полей таблиц
необходимо ввести ограничения (triggers, constraints). Данный этап поможет
избавиться от постоянных исправлений вручную, которые отнимут много
времени. Следуя данным правилам, будет получена эффективная модель БД.

8
Глава 2. Постановка задачи и предметная область

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

Функциональные требования
Данная предметная область предполагает, что каждое действие,
сделанное членом библиотеки (персоналом, читателем), должно отображаться
в базе данных. Все действия с данными происходят в реальном времени и
могут быть изменены, исправлены, удалены.
Для данной предметной области будут созданы отдельные сущности и
связи между ними. Самая главная сущность в данной предметной области —
это «Книга», в которой содержится одна из основных частей предметной
области. Также, сущности «Автор», «Жанр», «Публицист», «Поставщик»,
«Книга_НаРуках», «Полка» содержат более точную информацию о
предметной области. Данные сущности могут помочь классифицировать и
получить некоторые статистики в будущем. Для определения процесса
передачи книги читателю необходимо рассмотреть сущности
«Книга_НаРуках», «Персонал», «Читатель». Для рассмотрения процесса входа
в библиотеку читателем и входом в читальный зал необходимо добавить
сущности «ЧитальныйЗал» и «Библиотечный_Пропуск». Процесс выдачи
штрафа характеризуется сущностями «Книга_НаРуках» и «Штраф». После

9
описания данных сущностей отдельно, в совокупности с ними можно
рассматривать все процессы публичной библиотеки.
Сущности «Автор», «Жанр», «Публицист», «Поставщик»,
«Книга_НаРуках», «Полка» образуют сущность «Книга», которая содержит в
себе их атрибуты. Имена авторов, жанры, доступность, расположение на
полке, публицисты и поставщики определяют главную сущность «Книга» в
базе данных. Информация о книге предоставляется читателю и библиотекарю,
которые регулируют процесс выдачи и получения книги и\или штрафа,
который отображается в сущности «Книга_НаРуках». Так, например,
информация о том, кто выдал, кому выдано и на какой срок содержится в
данной сущности. Определение штрафа зависит от просрочки книги.
Разрешение на вход в определённый читальный зал лежит в сущности
«Библиотечный_Пропуск». Тем самым можем выделить несколько процессов,
которые, однако не могут стоять в хронологическом порядке, ведь библиотека
не предполагает продажу книг, а лишь их выдачу на время на дом , либо на
чтение в зале: вход\выход в\из библиотеку(и), выдача книги, вход\выход в\из
читальный(ого) зал(а), возврат книги, выдача штрафа. Стоит не забывать, что
база данных может быть использована для последующего создания сайта либо
приложения. Именно поэтому сущности «Пользователь» и «Роль» обязаны
присутствовать. Сложная, однако слаженная структура, дает возможность
разделить процессы между собой, при этом, не добавляя лишних сущностей.

10
Глава 3. Практическая реализация

Создание и описание сущностей


После описания предметной области и сущностей, входящих в нее,
необходимо построить модель базы данных. Для выполнения данной задачи
существует два инструмента: CA Erwin Data Modeler и MySQL Workbench.
Получили результаты:

Рисунок 1. Модель Базы данных в CA Erwin DM

Рисунок 2. Модель базы данных в MySQL Workbench

11
Сущности и атрибуты
В базе данных были использованы сущности с определенными
атрибутами. Мною представлены таблицы, которые описывают каждую
сущность и ее составляющие.
1) Staff
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
IDstaff int Идентификатор Первичный NOT NULL
персонала ключ PK
Staff_Name Varchar(25) Имя персонала NOT NULL
Staff_Surname Varchar(25) Фамилия NOT NULL
персонала
Staff_MiddleName Varchar(25) Отчество -
персонала
Staff_Salary int Зарплата NOT NULL
Staff_FirstDay DateTime Дата начала NOT NULL
работы
Staff_LastDay DateTime Дата -
окончания
Staff_BirthDay DateTime Дата рождения NOT NULL
Book_OnHand_ID int Идентификатор Внешний NOT NULL
Книги на руках ключ FK

12
2) Reader
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
IDreader int Идентификатор Первичный NOT NULL
книги ключ PK
Reader_Name Varchar(25) Имя читателя NOT NULL
Reader_Surname Varchar(25) Фамилия NOT NULL
читателя
Reader_MiddleName Varchar(25) Отчество -
читателя
Reader_JoinDay DateTime Дата NOT NULL
присоединения
к библиотеке
Reader_OfDocumentNumber DateTime Номер NOT NULL
официального
документа
Book_OnHand_ID int Идентификатор Внешний NOT NULL
книги на руках ключ FK

13
3) Book_OnHand
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
Book_exportDay DateTime Дата выдачи NOT NULL
книги
Book_returnDay DateTime Дата возврата NOT NULL
книги
Book_ActualDayreturn DateTime Реальная дата -
возврата книги
ID int Идентификатор Первичный NOT NULL
книги на руках ключ PK

4) Publisher
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
IDpublisher int Идентификатор Первичный NOT NULL
издательства ключ PK
Publisher_Name Varchar(25) Имя NOT NULL
издательства
5) Author
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
ID_Author int Идентификатор Первичный NOT NULL
автора ключ PK
Author_Name Varchar(25) Имя автора NOT NULL

14
6) Genre
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
ID_Genre int Идентификатор Первичный NOT NULL
жанра ключ PK
Genre_Name Varchar(25) Имя жанра NOT NULL

7) Book
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
IDbook int Идентификатор Первичный NOT NULL
книги ключ PK
Book_Name Varchar(25) Имя книги NOT NULL
Book_OnHand_ID int Идентификатор Внешний NOT NULL
книги на руках ключ FK
Publisher_IDPublisher int Идентификатор Внешний NOT NULL
издательства ключ FK
Author_ID_Author int Идентификатор Внешний NOT NULL
автора ключ FK
Genre_ID_Genre int Идентификатор Внешний NOT NULL
жанра ключ FK
Shelf_idShelf int Идентификатор Внешний NOT NULL
полки ключ FK

15
8) Provider
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
IDprovider int Идентификатор Первичный NOT NULL
поставщика ключ PK
Provider_Name Varchar(25) Имя поставщика NOT NULL
Provider_Phone int Телефон NOT NULL
поставщика
Provider_Location Varchar(25) Местонахождение NOT NULL
поставщика
Provider_Type Varchar(25) Тип книг NOT NULL
поставщика

9) Fee
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
ID_Fee int Идентификатор Первичный NOT NULL
штрафа ключ PK
Fee_Type Varchar(25) Тип штрафа NOT NULL
Fee_price int Цена штрафа NOT NULL

16
10) Library_Pass
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
idLibrary_Pass int Идентификатор Первичный NOT NULL
пропуска ключ PK
Library_Pass_Duration Varchar(25) Длительность NOT NULL
пропуска
Library_Pass_DayGiven DateTime Дата выдачи NOT NULL
пропуска
DateTime Дата NOT NULL
Library_Pass_ExpireDay окончания
действия
пропуска
Reader_IDreader int Идентификатор Внешний NOT NULL
читателя ключ FK

11) Shelf
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
idShelf int Идентификатор Первичный NOT NULL
полки ключ PK
Place_Number int Номер -
нахождения на
полке

17
Section_Number Varchar(25) Номер секции NOT NULL
нахождения

12) ReadingHall
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
idReadingHall int Идентификатор Первичный NOT NULL
читального ключ PK
зала
Number_of_Seats int Количество NOT NULL
мест
Number_Of_Avalaible_Seats int Количество -
доступных
мест
Library_Pass_idLibrary_Pass int Идентификатор Внешний NOT NULL
пропуска ключ FK

13) User
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
iduser int Идентификатор Первичный NOT NULL
пользователя ключ PK
Name Varchar(25) Имя NOT NULL
пользователя

18
14) Role
Имя столбца Тип Описание поля Комментарий Разрешение
данных значений
NULL
idrole int Идентификатор Первичный NOT NULL
роли ключ PK
Name_role Varchar(25) NOT NULL

Описание триггеров и запросов


Исходя из предметной области, можно вывести следующие триггеры,
которые нужно реализовать в базе данных:
1. Пропуск не может длиться больше 365 дней.
2. Зарплата работников не может быть ниже 12000 рублей
3. Сумма одного штрафа не может превышать 1000 рублей.
4. День возврата книги меняется на день назначенного возврата если
читатель возвращает его раньше.
5. Когда в таблицу добавляется новый штраф, всем сотрудникам
добавляется 1000 рублей к зарплате
Так как, у нас имеются пользователи (администратор и обычный
пользователь), необходимо составить для них запросы, соответствующие их
ролям:
Запросы администратора:
№ Запрос Пояснение
1 SELECT Book_OnHand.ID , Book.Book_Name Показывает какой
from Staff inner join Reader inner join
работник какую
Book_OnHand inner join Book
on книгу выдал (их
Staff.Book_OnHand_ID=Reader.Book_OnHand_ID
19
on Staff.Book_OnHand_ID=Book_OnHand.ID айди) группирует по
on Book.Book_OnHand_ID=Book_OnHand.ID
имени.
Group By Book.Book_Name
2 Select Staff.Name,Staff.Surname Показывает
from Staff
работников с
where Staff.Staff_Salary>25000
зарплатой больше 25
тыс.
3 Select Reader.Name, Reader.Surname Показывает имена и
from Reader inner join Library_Pass
фамилии читателей
on Reader.IDreader=Library_Pass.Reader_IDreader
where Library_Pass_Duration=365 чьи пропуски длятся
Group by Reader.IDreader
год
4 Select Fee.Fee_Type Показывает все типы
from Fee
штрафов, плата за
where Fee.Fee_price>100
которые превышает
100 рублей
5 SELECT AVG(Staff_Salary) Показывает
FROM Staff
среднюю зарплату
WHERE Staff.Staff_LastDay ISNOTNULL
не уволенного
персонала

Запросы пользователя:
№ Запрос Пояснение
1 Select Book.Book_Name, Genre.Genre_Name Показывает книги
from Book inner join Genre
жанра «фантастика»
on Book.Genre_ID_Genre=Genre.ID_Genre where
Genre.ID_Genre=6
Group by Genre.Genre_Name

2 Select Book.Book_Name, Author.Author_Name Показывает все


from Book inner join Author
книги Булгакова
on Book.Author_ID_Author=Author.ID_Author
where Author.ID_Author=4
Group by Author.Author_Name

20
3 Select Book.Book_Name, Показывает все
Publisher.Publisher_Name
книги издательства
from Book inner join Publisher
on «Просвещение»
Book.Publisher_IDpublisher=Publisher.IDpublisher
where Publisher.IDpublisher=1
Group by Publisher.Publisher_Name
4 Select Book.Book_Name, Показывает все
Publisher.Publisher_Name
книги издательства
from Book inner join Publisher
on «Гелеос»
Book.Publisher_IDpublisher=Publisher.IDpublisher
where Publisher.IDpublisher=2
Group by Publisher.Publisher_Name
5 Select Book.Book_Name, Author.Author_Name Показывает все
from Book inner join Author
книги Пушкина
on Book.Author_ID_Author=Author.ID_Author
where Author.ID_Author=1
Group by Author.Author_Name

DDL-скрипты
В данных скриптах реализованы создание таблиц со связями, триггеры,
описанные выше, и ввод данных.
Описание базы данных на языке SQL для последующей
реализации в качестве приложения или сайта (для phpMyAdmin):
CREATE DATABASE `mydb`;
USE `mydb` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Book_OnHand` (
`Book_exportDay` DATETIME NOT NULL COMMENT '',
`Book_returnDay` DATETIME NOT NULL COMMENT '',
`Book_ActualDayreturn` DATETIME NULL COMMENT '',
`ID` INT NOT NULL COMMENT '',
PRIMARY KEY (`ID`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Staff` (
21
`IDstaff` INT NOT NULL COMMENT '',
`Staff_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Staff_Surname` MEDIUMTEXT NOT NULL COMMENT '',
`Staff_MiddleName` MEDIUMTEXT NULL COMMENT '',
`Staff_Salary` INT NOT NULL COMMENT '',
`Staff_FirstDay` DATE NOT NULL COMMENT '',
`Staff_LastDay` DATE NULL COMMENT '',
`Staff_BirthDay` DATE NOT NULL COMMENT '',
`Book_OnHand_ID` INT NOT NULL COMMENT '',
PRIMARY KEY (`IDstaff`) COMMENT '',
CONSTRAINT `fk_Staff_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Reader` (
`IDreader` INT NOT NULL COMMENT '',
`Reader_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Reader_Surname` MEDIUMTEXT NOT NULL COMMENT '',
`Reader_MiddleName` MEDIUMTEXT NULL COMMENT '',
`Reader_JoinDay` DATE NOT NULL COMMENT '',
`Reader_OfDocumentNumber` INT NOT NULL COMMENT '',
`Book_OnHand_ID` INT NOT NULL COMMENT '',
PRIMARY KEY (`IDreader`) COMMENT '',
CONSTRAINT `fk_Reader_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
22
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Publisher` (
`IDpublisher` INT NOT NULL COMMENT '',
`Publisher_Name` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`IDpublisher`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Author` (
`ID_Author` INT NOT NULL COMMENT '',
`Author_Name` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`ID_Author`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Genre` (
`ID_Genre` INT NOT NULL COMMENT '',
`Genre_Name` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`ID_Genre`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Shelf` (
`idShelf` INT NOT NULL COMMENT '',
`Place_Number` INT NULL COMMENT '',
`Section_Number` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`idShelf`) COMMENT '')
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `mydb`.`Book` (


`IDbook` INT NOT NULL COMMENT '',
`Book_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Book_OnHand_ID` INT NOT NULL COMMENT '',
`Publisher_IDpublisher` INT NOT NULL COMMENT '',
`Author_ID_Author` INT NOT NULL COMMENT '',
`Genre_ID_Genre` INT NOT NULL COMMENT '',
23
`Shelf_idShelf` INT NOT NULL COMMENT '',
PRIMARY KEY (`IDbook`) COMMENT '',
CONSTRAINT `fk_Book_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Publisher1`
FOREIGN KEY (`Publisher_IDpublisher`)
REFERENCES `mydb`.`Publisher` (`IDpublisher`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Author1`
FOREIGN KEY (`Author_ID_Author`)
REFERENCES `mydb`.`Author` (`ID_Author`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Genre1`
FOREIGN KEY (`Genre_ID_Genre`)
REFERENCES `mydb`.`Genre` (`ID_Genre`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_Shelf1`
FOREIGN KEY (`Shelf_idShelf`)
REFERENCES `mydb`.`Shelf` (`idShelf`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Provider` (
`IDprovider` INT NOT NULL COMMENT '',
24
`Provider_Name` MEDIUMTEXT NOT NULL COMMENT '',
`Provider_Phone` INT NOT NULL COMMENT '',
`Provider_Location` MEDIUMTEXT NOT NULL COMMENT '',
`Provider_Type` MEDIUMTEXT NOT NULL COMMENT '',
PRIMARY KEY (`IDprovider`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Book_has_Provider` (
`Book_IDbook` INT NOT NULL COMMENT '',
`Provider_IDprovider` INT NOT NULL COMMENT '',
PRIMARY KEY (`Book_IDbook`, `Provider_IDprovider`)
COMMENT '',
CONSTRAINT `fk_Book_has_Provider_Book1`
FOREIGN KEY (`Book_IDbook`)
REFERENCES `mydb`.`Book` (`IDbook`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_has_Provider_Provider1`
FOREIGN KEY (`Provider_IDprovider`)
REFERENCES `mydb`.`Provider` (`IDprovider`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Fee` (
`ID_Fee` INT NOT NULL COMMENT '',
`Fee_Type` VARCHAR(45) NOT NULL COMMENT '',
`Fee_price` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`ID_Fee`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Book_OnHand_has_Fee`
(
25
`Book_OnHand_ID` INT NOT NULL COMMENT '',
`Fee_ID_Fee` INT NOT NULL COMMENT '',
PRIMARY KEY (`Book_OnHand_ID`, `Fee_ID_Fee`) COMMENT
'',
CONSTRAINT `fk_Book_OnHand_has_Fee_Book_OnHand1`
FOREIGN KEY (`Book_OnHand_ID`)
REFERENCES `mydb`.`Book_OnHand` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Book_OnHand_has_Fee_Fee1`
FOREIGN KEY (`Fee_ID_Fee`)
REFERENCES `mydb`.`Fee` (`ID_Fee`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`Library_Pass` (
`idLibrary_Pass` INT NOT NULL COMMENT '',
`Library_Pass_Duration` MEDIUMTEXT NOT NULL COMMENT
'',
`Library_Pass_DayGiven` DATETIME NOT NULL COMMENT '',
`Library_Pass_ExpireDay` DATETIME NOT NULL COMMENT '',
`Reader_IDreader` INT NOT NULL COMMENT '',
PRIMARY KEY (`idLibrary_Pass`) COMMENT '',
CONSTRAINT `fk_Library_Pass_Reader1`
FOREIGN KEY (`Reader_IDreader`)
REFERENCES `mydb`.`Reader` (`IDreader`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`user` (
26
`iduser` INT NOT NULL COMMENT '',
`Name` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`iduser`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`role` (
`idrole` INT NOT NULL COMMENT '',
`Name_role` VARCHAR(45) NOT NULL COMMENT '',
PRIMARY KEY (`idrole`) COMMENT '')
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`user_has_role` (
`user_iduser` INT NOT NULL COMMENT '',
`role_idrole` INT NOT NULL COMMENT '',
PRIMARY KEY (`user_iduser`, `role_idrole`) COMMENT '',
CONSTRAINT `fk_user_has_role_user1`
FOREIGN KEY (`user_iduser`)
REFERENCES `mydb`.`user` (`iduser`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_user_has_role_role1`
FOREIGN KEY (`role_idrole`)
REFERENCES `mydb`.`role` (`idrole`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `mydb`.`ReadingHall` (
`idReadingHall` INT NOT NULL COMMENT '',
`Number_of_Seats` INT NOT NULL COMMENT '',
`Number_Of_Avalaible_Seats` INT NULL COMMENT '',
`Library_Pass_idLibrary_Pass` INT NOT NULL COMMENT '',
PRIMARY KEY (`idReadingHall`) COMMENT '',
27
CONSTRAINT `fk_ReadingHall_Library_Pass1`
FOREIGN KEY (`Library_Pass_idLibrary_Pass`)
REFERENCES `mydb`.`Library_Pass` (`idLibrary_Pass`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`,
`Book_returnDay`, `Book_ActualDayreturn`, `ID`) VALUES ('15.02.2018',
'22.02.2018', NULL, 1);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`,
`Book_returnDay`, `Book_ActualDayreturn`, `ID`) VALUES ('15.02.2018',
'22.02.2018', NULL, 2);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`,
`Book_returnDay`, `Book_ActualDayreturn`, `ID`) VALUES ('18.06.2017',
'30.06.2017', '21.08.2017', 3);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`,
`Book_returnDay`, `Book_ActualDayreturn`, `ID`) VALUES ('15.02.2018',
'17.02.2018', NULL, 4);
INSERT INTO `mydb`.`Book_OnHand` (`Book_exportDay`,
`Book_returnDay`, `Book_ActualDayreturn`, `ID`) VALUES ('17.02.2018',
'20.02.2018', '10.03.2018', 5);

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`,
28
`Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`, `Staff_FirstDay`,
`Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (1,
'Иван', 'Иванов', 'Иванович', 12000, '15.02.2018', NULL, '15.02.2018', 1);
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`,
`Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`, `Staff_FirstDay`,
`Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (2, 'Алла
', 'Дмитриева', 'Прикофьевна', 15000, '30.06.1991', '15.02.2018',
'05.03.1953', 3);
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`,
`Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`, `Staff_FirstDay`,
`Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (3,
'Мария', 'Кондрабаева', 'Петровна', 100000, '03.01.1998', NULL,
'15.03.1962', 4);
INSERT INTO `mydb`.`Staff` (`IDstaff`, `Staff_Name`,
`Staff_Surname`, `Staff_MiddleName`, `Staff_Salary`, `Staff_FirstDay`,
`Staff_LastDay`, `Staff_BirthDay`, `Book_OnHand_ID`) VALUES (4,
'Кирилл', 'Каштанов', 'Сергеевич', 600000, '07.11.2016', NULL,
'07.11.1999', 5);

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Reader` (`IDreader`, `Reader_Name`,
`Reader_Surname`, `Reader_MiddleName`, `Reader_JoinDay`,
`Reader_OfDocumentNumber`, `Book_OnHand_ID`) VALUES (1, 'Венера',
'Гильманова', 'Миневагизовна', '15.02.2018', 5465435, 3);
INSERT INTO `mydb`.`Reader` (`IDreader`, `Reader_Name`,
`Reader_Surname`, `Reader_MiddleName`, `Reader_JoinDay`,
`Reader_OfDocumentNumber`, `Book_OnHand_ID`) VALUES (2, 'Мария',
'Альчикова', 'Сергеевна', '31.07.2018', 5456454, 2);
29
COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Publisher` (`IDpublisher`, `Publisher_Name`)
VALUES (1, 'Просвещение');
INSERT INTO `mydb`.`Publisher` (`IDpublisher`, `Publisher_Name`)
VALUES (2, 'Гелеос');

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`)
VALUES (1, 'А.С.Пушкин');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`)
VALUES (2, 'М.Ю.Лермонтов');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`)
VALUES (3, 'Л.Н. Толстой');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`)
VALUES (4, 'М.А. Булгаков');
INSERT INTO `mydb`.`Author` (`ID_Author`, `Author_Name`)
VALUES (5, 'А.Н. Толстой');

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`)
VALUES (1, 'исторический');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`)
VALUES (2, 'сказка');
30
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`)
VALUES (3, 'поэзия');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`)
VALUES (4, 'психологический');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`)
VALUES (5, 'реализм');
INSERT INTO `mydb`.`Genre` (`ID_Genre`, `Genre_Name`)
VALUES (6, 'фантастика');

COMMIT;

START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (1, 1, 'A');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (2, 2, 'A');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (3, 3, 'A');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (4, 1, 'B');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (5, 2, 'B');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (6, 3, 'B');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (7, 1, 'C');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
`Section_Number`) VALUES (8, 2, 'C');
INSERT INTO `mydb`.`Shelf` (`idShelf`, `Place_Number`,
31
`Section_Number`) VALUES (9, 3, 'C');

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (1, 'Капитанская дочка', 1, 1,
1, 1, 1);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (2, 'Сказка о золотом
петушке', 3, 2, 1, 2, 9);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (3, 'Мцыри', 4, 2, 2, 3, 8);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (4, 'Герой нашего времени',
5, 1, 2, 4, 7);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (5, 'Война и мир', 2, 1, 3, 1,
6);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (6, 'Анна Каренина', 1, 2, 3,
5, 5);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
32
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (7, 'Мастер и Маргарита', 4,
1, 4, 6, 4);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (8, 'Белая гвардия', 5, 2, 4, 1,
3);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (9, 'Хождение по мукам', 3,
2, 5, 1, 2);
INSERT INTO `mydb`.`Book` (`IDbook`, `Book_Name`,
`Book_OnHand_ID`, `Publisher_IDpublisher`, `Author_ID_Author`,
`Genre_ID_Genre`, `Shelf_idShelf`) VALUES (10, 'Гиперболоид и-ра
Гарина', 4, 1, 5, 6,1);

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Provider` (`IDprovider`, `Provider_Name`,
`Provider_Phone`, `Provider_Location`, `Provider_Type`) VALUES (1,
'Тезаурус', 4998989, 'Москва', 'Романы');
INSERT INTO `mydb`.`Provider` (`IDprovider`, `Provider_Name`,
`Provider_Phone`, `Provider_Location`, `Provider_Type`) VALUES (2,
'Современник', 4996699, 'Санкт-Петербург', 'Поэзия');

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (1, 2);
33
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (2, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (3, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (4, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (5, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (6, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (7, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (8, 1);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (9, 2);
INSERT INTO `mydb`.`Book_has_Provider` (`Book_IDbook`,
`Provider_IDprovider`) VALUES (10, 1);

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Fee` (`ID_Fee`, `Fee_Type`, `Fee_price`)
VALUES (1, 'просрочка за 1 день', '10');
INSERT INTO `mydb`.`Fee` (`ID_Fee`, `Fee_Type`, `Fee_price`)
VALUES (2, 'порча книги', '200');
INSERT INTO `mydb`.`Fee` (`ID_Fee`, `Fee_Type`, `Fee_price`)
VALUES (3, 'потеря книги', '1000');

COMMIT;
34
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Book_OnHand_has_Fee`
(`Book_OnHand_ID`, `Fee_ID_Fee`) VALUES (3, 2);

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`Library_Pass` (`idLibrary_Pass`,
`Library_Pass_Duration`, `Library_Pass_DayGiven`,
`Library_Pass_ExpireDay`, `Reader_IDreader`) VALUES (1, '365',
'15.02.2018', '15.02.2019', 2);
INSERT INTO `mydb`.`Library_Pass` (`idLibrary_Pass`,
`Library_Pass_Duration`, `Library_Pass_DayGiven`,
`Library_Pass_ExpireDay`, `Reader_IDreader`) VALUES (2, '182',
'31.07.2018', '31.01.2019',1);

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`user` (`iduser`, `Name`) VALUES (1,
'Venera');
INSERT INTO `mydb`.`user` (`iduser`, `Name`) VALUES (2, 'Maria');
INSERT INTO `mydb`.`user` (`iduser`, `Name`) VALUES (3, 'David');
INSERT INTO `mydb`.`user` (`iduser`, `Name`) VALUES (4, 'Igor');
INSERT INTO `mydb`.`user` (`iduser`, `Name`) VALUES (5, 'Filipp');
INSERT INTO `mydb`.`user` (`iduser`, `Name`) VALUES (6,
'Alexey');

COMMIT;
35
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`role` (`idrole`, `Name_role`) VALUES (1,
'admin');
INSERT INTO `mydb`.`role` (`idrole`, `Name_role`) VALUES (2,
'user');

COMMIT;
START TRANSACTION;
USE `mydb`;
INSERT INTO `mydb`.`ReadingHall` (`idReadingHall`,
`Number_of_Seats`, `Number_Of_Avalaible_Seats`,
`Library_Pass_idLibrary_Pass`) VALUES (1, 50, 50, 1);
INSERT INTO `mydb`.`ReadingHall` (`idReadingHall`,
`Number_of_Seats`, `Number_Of_Avalaible_Seats`,
`Library_Pass_idLibrary_Pass`) VALUES (2, 70, 70,2);
INSERT INTO `mydb`.`ReadingHall` (`idReadingHall`,
`Number_of_Seats`, `Number_Of_Avalaible_Seats`,
`Library_Pass_idLibrary_Pass`) VALUES (3, 55, 55,1);

COMMIT;

USE `mydb`;

DELIMITER $$
USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`mydb`.`Book_OnHand_AFTER_INSERT` AFTER INSERT ON
`Book_OnHand` FOR EACH ROW
BEGIN
36
update Book_OnHand
set Book_ActualDayreturn=Book_returnDay
where Book_ActualDayreturn<Book_returnDay;
END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`mydb`.`Staff_AFTER_INSERT` AFTER INSERT ON `Staff` FOR EACH
ROW
BEGIN
update staff
set Staff_Salary=12000
where Staff_Salary<12000;

END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`mydb`.`Fee_AFTER_INSERT` AFTER INSERT ON `Fee` FOR EACH
ROW
BEGIN
update Fee
set Fee_price=1000
where Fee_price>1000;
END
$$

USE `mydb`$$
37
CREATE DEFINER = CURRENT_USER TRIGGER
`mydb`.`Fee_AFTER_UPDATE` AFTER UPDATE ON `Fee` FOR EACH
ROW
BEGIN
update Staff
set Staff_Salary= Staff_Salary+1000;
END
$$

USE `mydb`$$
CREATE DEFINER = CURRENT_USER TRIGGER
`mydb`.`Library_Pass_AFTER_INSERT` AFTER INSERT ON
`Library_Pass` FOR EACH ROW
BEGIN
update Library_Pass
set Library_Pass_Duration=365
where Library_Pass_Duration>365;
END
$$

DELIMITER ;

38
Описание базы данных на языке SQL для MySQL Management
Studio 2014:
go
CREATE DATABASE PB;
GO
USE PB;
CREATE TABLE Book_OnHand (
Book_exportDay DATETIME NOT NULL ,
Book_returnDay DATETIME NOT NULL ,
Book_ActualDayreturn DATETIME NULL ,
ID INT NOT NULL ,
PRIMARY KEY ( ID ) )
;
CREATE TABLE Staff (
IDstaff INT NOT NULL ,
Staff_Name VARCHAR(45) NOT NULL ,
Staff_Surname VARCHAR(45) NOT NULL ,
Staff_MiddleName VARCHAR(45) NULL ,
Staff_Salary INT NOT NULL ,
Staff_FirstDay DATE NOT NULL ,
Staff_LastDay DATE NULL ,
Staff_BirthDay DATE NOT NULL ,
Book_OnHand_ID INT NOT NULL ,
39
PRIMARY KEY ( IDstaff ) ,
CONSTRAINT fk_Staff_Book_OnHand1
FOREIGN KEY ( Book_OnHand_ID )
REFERENCES Book_OnHand ( ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE Reader (
IDreader INT NOT NULL ,
Reader_Name VARCHAR(45) NOT NULL ,
Reader_Surname VARCHAR(45) NOT NULL ,
Reader_MiddleName VARCHAR(45) NULL ,
Reader_JoinDay DATE NOT NULL ,
Reader_OfDocumentNumber INT NOT NULL ,
Book_OnHand_ID INT NOT NULL ,
PRIMARY KEY ( IDreader ) ,
CONSTRAINT fk_Reader_Book_OnHand1
FOREIGN KEY ( Book_OnHand_ID )
REFERENCES Book_OnHand ( ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE Publisher (
IDpublisher INT NOT NULL ,
Publisher_Name VARCHAR(45) NOT NULL ,
PRIMARY KEY ( IDpublisher ) )
;
CREATE TABLE Author (
ID_Author INT NOT NULL ,
Author_Name VARCHAR(45) NOT NULL ,
40
PRIMARY KEY ( ID_Author ) )
;
CREATE TABLE Genre (
ID_Genre INT NOT NULL ,
Genre_Name VARCHAR(45) NOT NULL ,
PRIMARY KEY ( ID_Genre ) )
;
CREATE TABLE Shelf (
idShelf INT NOT NULL ,
Place_Number INT NULL ,
Section_Number VARCHAR(45) NOT NULL ,
PRIMARY KEY ( idShelf ) )
;

CREATE TABLE Book (


IDbook INT NOT NULL ,
Book_Name VARCHAR(45) NOT NULL ,
Book_OnHand_ID INT NOT NULL ,
Publisher_IDpublisher INT NOT NULL ,
Author_ID_Author INT NOT NULL ,
Genre_ID_Genre INT NOT NULL ,
Shelf_idShelf INT NOT NULL ,
PRIMARY KEY ( IDbook ) ,
CONSTRAINT fk_Book_Book_OnHand1
FOREIGN KEY ( Book_OnHand_ID )
REFERENCES Book_OnHand ( ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Publisher1
FOREIGN KEY ( Publisher_IDpublisher )
41
REFERENCES Publisher ( IDpublisher )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Author1
FOREIGN KEY ( Author_ID_Author )
REFERENCES Author ( ID_Author )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Genre1
FOREIGN KEY ( Genre_ID_Genre )
REFERENCES Genre ( ID_Genre )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_Shelf1
FOREIGN KEY ( Shelf_idShelf )
REFERENCES Shelf ( idShelf )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE Provider (
IDprovider INT NOT NULL ,
Provider_Name VARCHAR(45) NOT NULL ,
Provider_Phone INT NOT NULL ,
Provider_Location VARCHAR(45) NOT NULL ,
Provider_Type VARCHAR(45) NOT NULL ,
PRIMARY KEY ( IDprovider ) )
;
CREATE TABLE Book_has_Provider (
Book_IDbook INT NOT NULL ,
Provider_IDprovider INT NOT NULL ,
42
PRIMARY KEY ( Book_IDbook , Provider_IDprovider ) ,
CONSTRAINT fk_Book_has_Provider_Book1
FOREIGN KEY ( Book_IDbook )
REFERENCES Book ( IDbook )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_has_Provider_Provider1
FOREIGN KEY ( Provider_IDprovider )
REFERENCES Provider ( IDprovider )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE Fee (
ID_Fee INT NOT NULL ,
Fee_Type VARCHAR(45) NOT NULL ,
Fee_price VARCHAR(45) NOT NULL ,
PRIMARY KEY ( ID_Fee ) )
;
CREATE TABLE Book_OnHand_has_Fee (
Book_OnHand_ID INT NOT NULL ,
Fee_ID_Fee INT NOT NULL ,
PRIMARY KEY ( Book_OnHand_ID , Fee_ID_Fee ) ,
CONSTRAINT fk_Book_OnHand_has_Fee_Book_OnHand1
FOREIGN KEY ( Book_OnHand_ID )
REFERENCES Book_OnHand ( ID )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_Book_OnHand_has_Fee_Fee1
FOREIGN KEY ( Fee_ID_Fee )
REFERENCES Fee ( ID_Fee )
43
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE Library_Pass (
idLibrary_Pass INT NOT NULL ,
Library_Pass_Duration VARCHAR(45) NOT NULL ,
Library_Pass_DayGiven DATETIME NOT NULL ,
Library_Pass_ExpireDay DATETIME NOT NULL ,
Reader_IDreader INT NOT NULL ,
PRIMARY KEY ( idLibrary_Pass ) ,
CONSTRAINT fk_Library_Pass_Reader1
FOREIGN KEY ( Reader_IDreader )
REFERENCES Reader ( IDreader )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE user1 (
iduser1 INT NOT NULL ,
Name VARCHAR(45) NOT NULL ,
PRIMARY KEY ( iduser1 ) )

CREATE TABLE role (


idrole INT NOT NULL ,
Name_role VARCHAR(45) NOT NULL ,
PRIMARY KEY ( idrole ) )

CREATE TABLE user1_has_role (


user1_iduser1 INT NOT NULL ,
role_idrole INT NOT NULL ,
PRIMARY KEY ( user1_iduser1 , role_idrole ) ,
44
CONSTRAINT fk_user_has_role_user1
FOREIGN KEY ( user1_iduser1 )
REFERENCES user1 ( iduser1 )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT fk_user1_has_role_role1
FOREIGN KEY ( role_idrole )
REFERENCES role ( idrole )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;
CREATE TABLE ReadingHall (
idReadingHall INT NOT NULL ,
Number_of_Seats INT NOT NULL ,
Number_Of_Avalaible_Seats INT NULL ,
Library_Pass_idLibrary_Pass INT NOT NULL ,
PRIMARY KEY ( idReadingHall ) ,
CONSTRAINT fk_ReadingHall_Library_Pass1
FOREIGN KEY ( Library_Pass_idLibrary_Pass )
REFERENCES Library_Pass ( idLibrary_Pass )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
;

INSERT INTO Book_OnHand ( Book_exportDay ,


Book_returnDay , Book_ActualDayreturn , ID ) VALUES ('15.02.2018',
'22.02.2018', NULL, 1);
INSERT INTO Book_OnHand ( Book_exportDay ,
Book_returnDay , Book_ActualDayreturn , ID ) VALUES ('15.02.2018',
45
'22.02.2018', NULL, 2);
INSERT INTO Book_OnHand ( Book_exportDay ,
Book_returnDay , Book_ActualDayreturn , ID ) VALUES ('18.06.2017',
'30.06.2017', '21.08.2017', 3);
INSERT INTO Book_OnHand ( Book_exportDay ,
Book_returnDay , Book_ActualDayreturn , ID ) VALUES ('15.02.2018',
'17.02.2018', NULL, 4);
INSERT INTO Book_OnHand ( Book_exportDay ,
Book_returnDay , Book_ActualDayreturn , ID ) VALUES ('17.02.2018',
'20.02.2018', '10.03.2018', 5);

INSERT INTO Staff ( IDstaff , Staff_Name , Staff_Surname ,


Staff_MiddleName , Staff_Salary , Staff_FirstDay , Staff_LastDay ,
Staff_BirthDay , Book_OnHand_ID ) VALUES (1, 'Иван', 'Иванов',
'Иванович', 12000, '15.02.2018', NULL, '15.02.2018', 1);
INSERT INTO Staff ( IDstaff , Staff_Name , Staff_Surname ,
Staff_MiddleName , Staff_Salary , Staff_FirstDay , Staff_LastDay ,
Staff_BirthDay , Book_OnHand_ID ) VALUES (2, 'Алла ', 'Дмитриева',
'Прикофьевна', 15000, '30.06.1991', '15.02.2018', '05.03.1953', 3);
INSERT INTO Staff ( IDstaff , Staff_Name , Staff_Surname ,
Staff_MiddleName , Staff_Salary , Staff_FirstDay , Staff_LastDay ,
Staff_BirthDay , Book_OnHand_ID ) VALUES (3, 'Мария', 'Кондрабаева',
'Петровна', 100000, '03.01.1998', NULL, '15.03.1962', 4);
INSERT INTO Staff ( IDstaff , Staff_Name , Staff_Surname ,
Staff_MiddleName , Staff_Salary , Staff_FirstDay , Staff_LastDay ,
Staff_BirthDay , Book_OnHand_ID ) VALUES (4, 'Кирилл', 'Каштанов',
'Сергеевич', 600000, '07.11.2016', NULL, '07.11.1999', 5);

INSERT INTO Reader ( IDreader , Reader_Name ,


Reader_Surname , Reader_MiddleName , Reader_JoinDay ,
46
Reader_OfDocumentNumber , Book_OnHand_ID ) VALUES (1, 'Венера',
'Гильманова', 'Миневагизовна', '15.02.2018', 5465435, 3);
INSERT INTO Reader ( IDreader , Reader_Name ,
Reader_Surname , Reader_MiddleName , Reader_JoinDay ,
Reader_OfDocumentNumber , Book_OnHand_ID ) VALUES (2, 'Мария',
'Альчикова', 'Сергеевна', '31.07.2018', 5456454, 2);

INSERT INTO Publisher ( IDpublisher , Publisher_Name )


VALUES (1, 'Просвещение');
INSERT INTO Publisher ( IDpublisher , Publisher_Name )
VALUES (2, 'Гелеос');

INSERT INTO Author ( ID_Author , Author_Name ) VALUES


(1, 'А.С.Пушкин');
INSERT INTO Author ( ID_Author , Author_Name ) VALUES
(2, 'М.Ю.Лермонтов');
INSERT INTO Author ( ID_Author , Author_Name ) VALUES
(3, 'Л.Н. Толстой');
INSERT INTO Author ( ID_Author , Author_Name ) VALUES
(4, 'М.А. Булгаков');
INSERT INTO Author ( ID_Author , Author_Name ) VALUES
(5, 'А.Н. Толстой');

INSERT INTO Genre ( ID_Genre , Genre_Name ) VALUES (1,


'исторический');
INSERT INTO Genre ( ID_Genre , Genre_Name ) VALUES (2,
'сказка');
INSERT INTO Genre ( ID_Genre , Genre_Name ) VALUES (3,
'поэзия');
INSERT INTO Genre ( ID_Genre , Genre_Name ) VALUES (4,
47
'психологический');
INSERT INTO Genre ( ID_Genre , Genre_Name ) VALUES (5,
'реализм');
INSERT INTO Genre ( ID_Genre , Genre_Name ) VALUES (6,
'фантастика');

INSERT INTO Shelf ( idShelf , Place_Number , Section_Number


) VALUES (1, 1, 'A');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (2, 2, 'A');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (3, 3, 'A');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (4, 1, 'B');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (5, 2, 'B');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (6, 3, 'B');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (7, 1, 'C');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (8, 2, 'C');
INSERT INTO Shelf ( idShelf , Place_Number , Section_Number
) VALUES (9, 3, 'C');

INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID


, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (1, 'Капитанская дочка', 1, 1, 1, 1, 1);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
48
Shelf_idShelf ) VALUES (2, 'Сказка о золотом петушке', 3, 2, 1, 2, 9);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (3, 'Мцыри', 4, 2, 2, 3, 8);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (4, 'Герой нашего времени', 5, 1, 2, 4, 7);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (5, 'Война и мир', 2, 1, 3, 1, 6);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (6, 'Анна Каренина', 1, 2, 3, 5, 5);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (7, 'Мастер и Маргарита', 4, 1, 4, 6, 4);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (8, 'Белая гвардия', 5, 2, 4, 1, 3);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (9, 'Хождение по мукам', 3, 2, 5, 1, 2);
INSERT INTO Book ( IDbook , Book_Name , Book_OnHand_ID
, Publisher_IDpublisher , Author_ID_Author , Genre_ID_Genre ,
Shelf_idShelf ) VALUES (10, 'Гиперболоид и-ра Гарина', 4, 1, 5, 6,1);

INSERT INTO Provider ( IDprovider , Provider_Name ,


Provider_Phone , Provider_Location , Provider_Type ) VALUES (1,
'Тезаурус', 4998989, 'Москва', 'Романы');
INSERT INTO Provider ( IDprovider , Provider_Name ,
49
Provider_Phone , Provider_Location , Provider_Type ) VALUES (2,
'Современник', 4996699, 'Санкт-Петербург', 'Поэзия');

INSERT INTO Book_has_Provider ( Book_IDbook ,


Provider_IDprovider ) VALUES (1, 2);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (2, 1);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (3, 2);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (4, 1);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (5, 2);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (6, 1);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (7, 2);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (8, 1);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (9, 2);
INSERT INTO Book_has_Provider ( Book_IDbook ,
Provider_IDprovider ) VALUES (10, 1);

INSERT INTO Fee ( ID_Fee , Fee_Type , Fee_price ) VALUES


(1, 'просрочка за 1 день', '10');
INSERT INTO Fee ( ID_Fee , Fee_Type , Fee_price ) VALUES
(2, 'порча книги', '200');
INSERT INTO Fee ( ID_Fee , Fee_Type , Fee_price ) VALUES
(3, 'потеря книги', '1000');
50
INSERT INTO Book_OnHand_has_Fee ( Book_OnHand_ID ,
Fee_ID_Fee ) VALUES (3, 2);

INSERT INTO Library_Pass ( idLibrary_Pass ,


Library_Pass_Duration , Library_Pass_DayGiven ,
Library_Pass_ExpireDay , Reader_IDreader ) VALUES (1, '365',
'15.02.2018', '15.02.2019', 2);
INSERT INTO Library_Pass ( idLibrary_Pass ,
Library_Pass_Duration , Library_Pass_DayGiven ,
Library_Pass_ExpireDay , Reader_IDreader ) VALUES (2, '182',
'31.07.2018', '31.01.2019',1);

INSERT INTO user1 ( iduser1 , Name ) VALUES (1, 'Venera');


INSERT INTO user1 ( iduser1 , Name ) VALUES (2, 'Maria');
INSERT INTO user1 ( iduser1 , Name ) VALUES (3, 'David');
INSERT INTO user1 ( iduser1 , Name ) VALUES (4, 'Igor');
INSERT INTO user1 ( iduser1 , Name ) VALUES (5, 'Filipp');
INSERT INTO user1 ( iduser1 , Name ) VALUES (6, 'Alexey');

INSERT INTO role ( idrole , Name_role ) VALUES (1, 'admin');


INSERT INTO role ( idrole , Name_role ) VALUES (2, 'user');

INSERT INTO ReadingHall ( idReadingHall , Number_of_Seats


, Number_Of_Avalaible_Seats , Library_Pass_idLibrary_Pass ) VALUES
(1, 50, 50, 1);
INSERT INTO ReadingHall ( idReadingHall , Number_of_Seats
, Number_Of_Avalaible_Seats , Library_Pass_idLibrary_Pass ) VALUES
(2, 70, 70,2);
INSERT INTO ReadingHall ( idReadingHall , Number_of_Seats
51
, Number_Of_Avalaible_Seats , Library_Pass_idLibrary_Pass ) VALUES
(3, 55, 55,1);
GO
CREATE TRIGGER Library_Pass_AFTER_INSERT ON Library_Pass AFTER
INSERT, UPDATE AS
BEGIN
update Library_Pass
set Library_Pass_Duration=365
where Library_Pass_Duration>365;
END
go
CREATE TRIGGER Book_OnHand_AFTER_INSERT ON Book_OnHand
AFTER INSERT , UPDate as
BEGIN
update Book_OnHand
set Book_ActualDayreturn=Book_returnDay
where Book_ActualDayreturn<Book_returnDay;
END

go
CREATE TRIGGER Staff_AFTER_INSERT ON Staff AFTER INSERT, update as
BEGIN
update staff
set Staff_Salary=12000
where Staff_Salary<12000;

END

go
CREATE TRIGGER Fee_AFTER_INSERT ON Fee AFTER INSERT, update as
BEGIN
update Fee
set Fee_price=1000
where Fee_price>1000;
END

go
CREATE TRIGGER Fee_AFTER_UPDATE ON Fee AFTER UPDATE , insert as
BEGIN
update Staff
set Staff_Salary= Staff_Salary+1000;
END
52
Заключение
В ходе работы были достигнуты следующие цели: исследована
предметная область публичной библиотеки, выделены и описаны основные
сущности предметной области, описаны их атрибуты. Однако, самая главная
цель была достигнута: база данных была разработана. В нее вошли
необходимые данные, были сделаны нужные триггеры и были разработаны
важные запросы, на основе которых можно ориентироваться в будущих
потребностях пользователей.
База данных подойдет для дальнейшей разработки в качестве сайта на
языке php либо для приложения на C# и на других платформах.

53
Список литературы
1) MSDN - The Microsoft Developer Network [Электронный ресурс]//
URL: https://msdn.microsoft.com/
2) Т. Конноли, К. Бегг. Базы данных. Проектирование, реализация и
сопровождение. Теория и практика. К.: Вильямс, 2017.
3) Office-Menu – Статьи и уроки Excel&SQL [Электронный ресурс]//
URL: http://office-menu.ru/uroki-sql
4) С.М. Диго. БАЗЫ ДАННЫХ. ПРОЕКТИРОВАНИЕ И СОЗДАНИЕ:
Учебно-методический комплекс. М.: ЕАОИ, 2008.

54

Вам также может понравиться