Главная страница

СУБД ПЗ Аврамец. Курсовая работа по дисциплине Базы и хранилища данных Разработка базы данных для предметной области Библиотека


Скачать 0.54 Mb.
НазваниеКурсовая работа по дисциплине Базы и хранилища данных Разработка базы данных для предметной области Библиотека
Дата12.05.2023
Размер0.54 Mb.
Формат файлаdocx
Имя файлаСУБД ПЗ Аврамец.docx
ТипКурсовая
#1125618

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное

образовательное учреждение высшего образования

«Челябинский государственный университет»

(ФГБОУ ВО «ЧелГУ»)
Институт информационных технологий
Кафедра информационных технологий и экономической информатики
КУРСОВАЯ РАБОТА
по дисциплине «Базы и хранилища данных»
__________«Разработка базы данных для предметной области «Библиотека»_________

(тема)


Выполнил студент__ Аврамец С.А. ______

(Ф.И.О.)

группы_<номер группы>_____

заочной формы обучения

направления подготовки

_____<Название направления обучения> ____________________________________

(подпись)

«____» ____________ 20___г.




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

Фамилия, имя, отчество__Сичинский Д.А._

Должность____________________________

Ученая степень ________________________

Ученое звание _________________________

______________________________________

(подпись)

«___» _________ 20____г.


Челябинск

2020

Задание


  1. Провести анализ предметной области по следующему описанию:

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

Перечень входных (первичных) документов.

название книги

название зала

Автор

Место издания

Издательство

Год издания

номер билета читателя

Область знаний

Море

зал художественной литературы

Пушкин А.С

Москва

Альфа

1951

1

Живописные рассказы

Принципы ООП

зал технической литературы

Буч

Челябинск

2-комсомольца

2000

2

Программирование

Продолжение таблицы:

количество страниц

Дата выдачи книги

Дата возврата

Фио читателя

Дата рождения

Телефон

17

22/10/2014

22/11/2014

Алешкин Иван Николаевич

18/11/1991

+7 (954) 1111111

188

21/10/15

05/12/15

Бородкин Семен

25/05/1928





Ограничения предметной области:

  • Одна книга (Название, Автор, год издания) может быть в нескольких экземплярах.

  • Один читатель не может взять более 5 книг.

  • Один читатель не может взять 2 экземпляра (одинаковым названием, автором, год издания) одной книги.

  • Дата выдачи, дата возврата и дата рождения хранятся в виде DD/MM/YYYY

  • Телефон имеет вид +7 (111) 1765880

  • Области знаний бывают 3-х типов (любые).

  • Читальных залы бывают 3-х типов (зал художественной литературы, зал технической литературы, зал иностранной литературы).

  • Дата возврата книги не может быть раньше даты получения!

  1. Выполнить концептуальное (инфологическое) проектирование.

  2. Выполнить даталогическое проектирование для реляционной базы данных.

  3. Выбрать СУБД (обосновав выбор) и выполнить физическое проектирование.

  4. Создать базу данных в выбранной СУБД с учетом ограничений предметной области.

  5. Реализовать следующие отчеты (запросы):

  1. Посчитать за каждый месяц года, определенного пользователем, количество выдач книг.

  2. Вывести название и возраст книги самой старой книги в каждом из залов.

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

  4. Вывести 5 лучших книг, которые за прошедший месяц пользовались наибольшим спросом.

  1. Выбрать язык программирования и разработать приложение для работы с БД (формы ввода/редактирования данных и отчеты).

  2. Оформить пояснительную записку.

Содержание

Задание 2

Содержание 4

Концептуальная модель БД 6

Логическая модель БД 8

Физическая модель БД 12

Описание приложения для работы с БД 15

Заключение 24

Библиография 25

Приложение 1. SQL скрипты 26

Приложение 2. Код веб-приложения 30


Заказчик использует базу данных, которая содержит информацию о работе библиотеки.

Библиотека состоит из нескольких читальных залов (зал художественной литературы, зал технической литературы, зал иностранной литературы).

Библиотекари выдают книги читателям.

Требуемые функции системы, использующей базу данных:

        1. Ведение учёта посетителей библиотеки

        2. Ведение учёта книг, имеющихся в библиотеке

        3. Ведение учёта посещений читателями библиотеки (регистрация выдачи книг на руки и их возврата)

База данных проектируется с учётом следующих особенностей:

    1. Одна книга (Название, Автор, год издания) может быть в нескольких экземплярах.

    2. Один читатель не может взять более 5 книг.

    3. Один читатель не может взять 2 экземпляра (одинаковым названием, автором, год издания) одной книги.

    4. Дата выдачи, дата возврата и дата рождения хранятся в виде DD/MM/YYYY

    5. Телефон имеет вид +7 (111) 1765880

    6. Области знаний бывают 3-х типов (любые).

    7. Читальных залы бывают 3-х типов (зал художественной литературы, зал технической литературы, зал иностранной литературы).

    8. Дата возврата книги не может быть раньше даты получения!


Концептуальная модель БД

На этом этапе необходимо выделить основные сущности, атрибуты сущностей и связи между сущностями, а так же построить ER-диаграмму в нотации Питера Чена.

Базовые сущности предметной области:

Таблица 1. Таблица сущностей

Наименование сущности

Описание сущности

Первичный ключ

Книга

Книга, которую выдают на руки читателю

ID книги

Читальный зал

Читальный зал, в котором может находиться книга

ID читального зала

Область знаний

Сфера, о которой написана книга

ID области знаний

Читатель

Читатель, который берет в библиотеке книги на время

ID читателя


Теперь определим атрибуты для каждой сущности:

Таблица 2. Таблица атрибутов

Сущность

Наименование атрибута

Тип значения

Может ли быть пустым

Книга

Название

VARCHAR

Нет

Автор

VARCHAR

Нет

Год издания

INT

Нет

Количество страниц

INT

Нет

Место издания

VARCHAR

Нет

Издательство

VARCHAR

Нет

Читальный зал

Название

VARCHAR

Нет

Область знаний

Название

VARCHAR

Нет

Читатель

ФИО

VARCHAR

Нет

Телефон

VARCHAR

Нет

День рождения

VARCHAR

Нет


Между сущностями определены следующие связи:

Таблица 3. Таблица связей

Наименование связи

Тип связи

Атрибуты связи

Книга : область знаний

Один к одному

Нет

Книга : читальный зал

Один к одному

Нет

Читатель : книга

Один ко многим

Дата выдачи

Дата возврата

Список книг


Подобно тому, как выше рассмотрены атрибуты сущностей, рассмотрим атрибуты связей.

Таблица 4. Атрибуты связей

Связь

Наименование атрибута

Тип значения

Может ли быть пустым

Атомарность

Читатель : книга

Дата выдачи

VARCHAR

Нет

Да

Дата возврата

VARCHAR

Нет

Да





Рисунок 1. Инфологическая диаграмма
На основе приведенного выше описания сущностей и связей составим ER-диаграмму.
Логическая модель БД


Основная задача данного этапа проектирования - переложить концептуальную модель на реляционную.

Для этого нужно определить все информационные единицы и связи между ними, задать их имена, а также некоторые количественные характеристики, например, длину элементов. Отношение представляется как определенным образом организованная таблица.

Результатом работы на этом этапе будет ER-диаграмма в нотации «воронья лапка».

Перед тем, как превращать модель базы в перечень таблиц в СУБД, необходимо избавиться от избыточности информации и аномалий исходных схем БД. Частично, эта работы была уже проведена на этапе инфологического проектирования - в отдельные сущности были выделены читальный зал и область знаний, которые изначально могли быть представлены в виде атрибутов книги.

Составим таблицы, соответствующие сущностям.

Таблица 5. readers - таблица с данными о читателях

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор читателя

name (varchar)

полное имя читателя

phone (varchar)

номер телефона

birthday (date)

дата рождения


Таблица 6. types - области знаний

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор области знаний

name (varchar)

название типа области знаний


Таблица 7. readrooms - читальные залы

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор читального зала

name (varchar)

название читального зала



Таблица 8. books - книги

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор книги

name (varchar)

название книги

phone (varchar)

автор книги

year (int)

дата публикации книги

pubplace (varchar)

город издания

pubhouse (varchar)

издательство

type (int, FK)

область знаний (идентификатор области из таблицы types)

readroom (int, FK)

читальный зал (идентификатор зала из таблицы readrooms)


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

Для отношения «читатель : книга» потребуется отдельная таблица, тождественная заявке на выдачу книг, или читательскому требованию в библиотечных терминах.
Таблица 9. slips - читательские требования

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор читательского требования

reader (int, FK)

читатель (идентификатор читателя из таблицы readers)

timefrom (date)

дата выдачи книг на руки

timeto (date)

дата возврата книг

books (int, FK)

список книг, выданных на руки (идентификаторы книг из таблицы books)


Здесь следует обратить внимание на то, что поле «books» в таблице противоречит определению первой нормальной формы (1НФ), его значения не атомарны.

Для обеспечения его атомарности вынесем соответствие читательского требования и книги в отдельное отношение.
Таблица 10. slips_info - информация о соответствии книги читательскому требованию

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор записи

slip (int, FK)

ID читательского требования из таблицы slips

book (int, FK)

ID книги из таблицы books


Эта таблица тоже находится в 3НФ. В результате выделения этих данных в отдельное отношения, таблица «slips» примет следующий вид:
Таблица 11. таблица slips после нормализации

наименование

описание

id (int, PK, autoincrement)

уникальный идентификатор читательского требования

reader (int, FK)

читатель (идентификатор читателя из таблицы readers)

timefrom (date)

дата выдачи книг на руки

timeto (date)

дата возврата книг


И тоже будет находиться в 3НФ, так как потенциальных ключей, кроме ID, в ней не будет, каждый неключевой атрибут будет зависеть только от ключевого.

В результате проектирования получится схема, изображенная на рисунке 2.


Рисунок 2. ER-диаграмма в нотации "воронья лапка"


Физическая модель БД


Физическое проектирование базы данных подразумевает выбор способа хранения и размещения базы на физических носителях, определение формы её хранения и доступа к ней.

В современности это обозначает, в основном, лишь выбор систему управления базами данных (СУБД), так как каждая из них определяет по умолчанию свой способ хранения данных.

В ряде случаев, однако, этим фактором можно управлять. Например, для данного проекта была выбрана СУБД MySQL 8.0, самая актуальная на сегодня версия. Причиной такого выбора послужила ее распространенность и большое количество справочных материалов и форумов. В этой СУБД можно выбирать способ хранения данных - в виде таблиц InnDB, MyISAM, InMemory, в одном файле на базу или по файлу на каждую таблицу.

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

Ниже приведены запросы на создание базы данных и таблиц спроектированной БД на синтаксисе MySQL.

Создание БД:

CREATE DATABASE `library`;
Таблица readers:

CREATE TABLE `readers` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

`phone` varchar(50) NOT NULL,

`birthday` varchar(10) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;
Таблица types:

CREATE TABLE `types` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;
Таблица readrooms:

CREATE TABLE `readrooms` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;
Таблица slips:

CREATE TABLE `slips` (

`id` int NOT NULL AUTO_INCREMENT,

`reader` int NOT NULL,

`timefrom` varchar(10) NOT NULL,

`timeto` varchar(10) NOT NULL,

PRIMARY KEY (`id`),

KEY `reader_idx` (`reader`),

CONSTRAINT `reader` FOREIGN KEY (`reader`) REFERENCES `readers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB;
Таблица books:

CREATE TABLE `books` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

`author` varchar(50) NOT NULL,

`year` year NOT NULL,

`pubplace` varchar(200) NOT NULL,

`pubhouse` varchar(200) NOT NULL,

`type` int NOT NULL,

`readroom` int NOT NULL,

`pages` int NOT NULL,

PRIMARY KEY (`id`),

KEY `type` (`type`),

KEY `readroom` (`readroom`),

CONSTRAINT `books_ibfk_1` FOREIGN KEY (`type`) REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `books_ibfk_2` FOREIGN KEY (`readroom`) REFERENCES `readrooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB;
Таблица slips_info:

CREATE TABLE `slips_info` (

`id` int NOT NULL AUTO_INCREMENT,

`slip` int NOT NULL,

`book` int NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `books_in_slip` (`slip`,`book`),

KEY `book` (`book`),

CONSTRAINT `book` FOREIGN KEY (`book`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `slip` FOREIGN KEY (`slip`) REFERENCES `slips` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB;
Данные запросы, в предварительно настроенной СУБД, создадут структура базы данных.

Описание приложения для работы с БД


Приложение для работы с БД представляет собой веб-интерфейс, осуществляющий добавление, удаление и изменение данных в базе, написанный на php.

Выбор языка обусловлен его простотой и лёгкостью в обслуживании, а так же, популярностью в сообществе. На этом языке написано большое количество веб-логики.

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

Однако часть из них достаточно сложна, и требует проверок перед вставкой, либо же множественных вставок, поэтому реализована в виде процедур СУБД.

Это касается добавления/удаления/изменения читателей и заявок на выдачу книг - для этих функций были написаны хранимые процедуры:

Процедура добавления читателя:

DELIMITER $$

CREATE PROCEDURE `add_reader`(name varchar(50), phone varchar(14), birthday date)

begin

select phone regexp '\\+7\\([:digit:]{3}\\)[:digit:]{7}$' into @phone_in_right_format;

if @phone_in_right_format = 0 then select 'error' as result, 'введите телефон в формате +7(XXX)XXXXXXX' as detail;

else

insert into readers values (default, name, phone, date_format(birthday, '%d/%m/%Y'));

end if;

end$$

DELIMITER ;
Процедура изменения читателя:

DELIMITER $$

CREATE PROCEDURE `edit_reader`(edit_id int, new_name varchar(50), new_phone varchar(14), new_birthday date)

begin

select new_phone regexp '\\+7\\([:digit:]{3}\\)[:digit:]{7}$' into @phone_in_right_format;

if @phone_in_right_format = 0 then select 'error' as result, 'введите телефон в формате +7(XXX)XXXXXXX' as detail;

else

update readers r set `r`.`name` = new_name, `r`.`phone` = new_phone, `r`.`birthday` = date_format(new_birthday, '%d/%m/%Y') where `r`.`id` = edit_id;

end if;

end$$

DELIMITER ;
Процедура добавления заявки:

DELIMITER $$

CREATE PROCEDURE `add_slip`(reader int, timefrom date, timeto date)

begin

if timefrom > timeto then select 'error' as result, 'дата выдачи позднее даты возврата' as detail;

else

insert into slips values (default, reader, date_format(timefrom, '%d/%m/%Y'), date_format(timeto, '%d/%m/%Y'));

select id from slips order by 1 desc;

end if;

end$$

DELIMITER ;
Процедура изменения деталей заявки:

DELIMITER $$

CREATE PROCEDURE `add_slip_nfo`(slip int, book int)

begin

select count(*) from slips_info si where si.slip = slip into @books_in_slip;
if @books_in_slip >= 5 then select 'error' as result, 'одному читателю можно выдать не более 5 книг' as detail;

else

insert into slips_info values (default, slip, book);

select 'success' as result, 'книга внесена в читательское требование' as detail;

end if;

end$$

DELIMITER ;
Само приложение представляет собой набор веб-страниц, с доступом к этим функциям.

На главной странице (рисунок 3) меню, с основными разделами и краткое описание системы.

Это меню дублируется на каждой странице для удобства перемещения по страницам.




Рисунок 4. Читальные залы

Рисунок 3. Главная страница
Самыми простыми разделами являются «читальные залы», «области знаний», и «читатели» - в них просто можно просматривать и управлять списком залов, типов и посетителей, соответственно, с помощью соответствующих кнопок.



Рисунок 5. Редактирование зала
Кнопка «редактировать» откроет форму, в которой можно изменить название зала.



Рисунок 6. Добавление нового зала
Кнопка «добавить» откроет похожую форму для добавления нового. По условию задания залов три, однако, было решено добавить возможность добавлять и изменять их по своему усмотрению.

Кнопка «удалить» удаляет выбранный читальный зал.



Рисунок 7. Области знаний
Абсолютно так же работает форма управления типами областей знаний.

Нет никакого отличия от предыдущих форм, как в виде, так и в выполняемых функциях.

То же самое касается и страницы со списком читателей, с той разницей, что форма добавления и изменения посетителя работает с другими данными:




Рисунок 8. Добавление читателя



Рисунок 9. Управление читательскими требованиями
Несколько сложнее устроен интерфейс управления заявками на выдачу книг.

Удаление будет работать так же, как и на других экранах, функции «добавить» и «открыть» будут открывать новое окно, с другим интерфейсом.



Рисунок 10. Добавление новой заявки
Здесь для новой заявки нужно будет ввести все необходимые данные для ее регистрации. Кнопка «создать требование» создаст заявку и закроет окно. Кнопка «отмена» просто его закроет.



Рисунок 11. Просмотр и редактирование требования
На предыдущей форме, так же, можно открыть интересующее читательское требование для его последующего просмотра и редактирования. Откроется форма со списком книг и кнопками для их добавления и удаления.



Рисунок 12. Добавление книги в требование
Кнопка «удалить» просто удаляет книгу. Кнопка «закрыть» просто закрывает вкладку. Кнопка «добавить книгу» открывает форму добавления книги со списком доступных книг.



Рисунок 13. Отчеты
Тут можно выбрать в выпадающем списке нужную и нажав кнопку «добавить» добавить её к списку.

На рисунке 13 показаны формы получения отчетов, которые нужно было реализовать по заданию.

Чтобы получить отчет, нужно ввести входные данные в поле, если они предусмотрены, и нажать кнопку «выгрузить».



Рисунок 14. Отчет А
Отчёт с выгрузкой количества выдач по месяцам в заданном году:



Рисунок 15. Отчет B
Самые старые книги по читальным залам:



Рисунок 16. Отчет C
Зал, в котором есть книги только выбранных пользователем типов (ни больше, ни меньше):



Рисунок 17. Отчет D
Пять самых популярных книг:

Код всех процедур и самого веб-приложения приведен в приложениях 1 и 2.

Заключение


База данных - очень мощный инструмент, позволяющий управлять огромным количеством информации, использовать её и анализировать.

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

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

Данная курсовая работа позволила автоматизировать учет книг и выдачу книг читателям в библиотеке.

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


Библиография


Основная литература

  1. И.П. Карпова. Базы данных: Учебное пособие. СПб: Питер, 2013г. – 240с.




  1. М.П. Малыхина. Базы данных: основы, проектирование, использование. 2-е изд. СПб: БХВ-Петербург, 2007.




  1. В.В. Кирилов, Г.Ю. Громов. Введение в реляционные базы данных. – СПб.:БХВ-Петербург, 2009г. – 464с.


Дополнительная литература


  1. Т. Конноли, К. Бегг. Базы данных: проектирование, реализация и сопровождение. Теория и практика. Вильямс, 2003г – 1440с.

  2. Г. Хансен, Дж. Хансен. Базы данных: разработка и управление. М: Бином, 1999г. – 704с.




  1. Г. Гарсиа-Молина, Дж. Ульман, Дж. Уидом. Системы баз данных. Полный курс. Вильямс, 2003г. – 1088с.


Интернет-источники


        1. Справочник по HTML и CSS: https://www.w3.org/Style/Examples/011/firstcss.ru.html

        2. Документация MySQL: https://dev.mysql.com/doc/refman/8.0/en/

        3. Документация PHP: https://www.php.net/manual/ru/index.php


Приложение 1. SQL скрипты


Создание БД:

CREATE DATABASE `library`;
Таблица readers:

CREATE TABLE `readers` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

`phone` varchar(50) NOT NULL,

`birthday` varchar(10) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;
Таблица types:

CREATE TABLE `types` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;
Таблица readrooms:

CREATE TABLE `readrooms` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;
Таблица slips:

CREATE TABLE `slips` (

`id` int NOT NULL AUTO_INCREMENT,

`reader` int NOT NULL,

`timefrom` varchar(10) NOT NULL,

`timeto` varchar(10) NOT NULL,

PRIMARY KEY (`id`),

KEY `reader_idx` (`reader`),

CONSTRAINT `reader` FOREIGN KEY (`reader`) REFERENCES `readers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB;
Таблица books:

CREATE TABLE `books` (

`id` int NOT NULL AUTO_INCREMENT,

`name` varchar(50) NOT NULL,

`author` varchar(50) NOT NULL,

`year` year NOT NULL,

`pubplace` varchar(200) NOT NULL,

`pubhouse` varchar(200) NOT NULL,

`type` int NOT NULL,

`readroom` int NOT NULL,

`pages` int NOT NULL,

PRIMARY KEY (`id`),

KEY `type` (`type`),

KEY `readroom` (`readroom`),

CONSTRAINT `books_ibfk_1` FOREIGN KEY (`type`) REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `books_ibfk_2` FOREIGN KEY (`readroom`) REFERENCES `readrooms` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB;
Таблица slips_info:

CREATE TABLE `slips_info` (

`id` int NOT NULL AUTO_INCREMENT,

`slip` int NOT NULL,

`book` int NOT NULL,

PRIMARY KEY (`id`),

UNIQUE KEY `books_in_slip` (`slip`,`book`),

KEY `book` (`book`),

CONSTRAINT `book` FOREIGN KEY (`book`) REFERENCES `books` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,

CONSTRAINT `slip` FOREIGN KEY (`slip`) REFERENCES `slips` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

) ENGINE=InnoDB;
Процедура добавления читателя:

DELIMITER $$

CREATE PROCEDURE `add_reader`(name varchar(50), phone varchar(14), birthday date)

begin

select phone regexp '\\+7\\([:digit:]{3}\\)[:digit:]{7}$' into @phone_in_right_format;

if @phone_in_right_format = 0 then select 'error' as result, 'введите телефон в формате +7(XXX)XXXXXXX' as detail;

else

insert into readers values (default, name, phone, date_format(birthday, '%d/%m/%Y'));

end if;

end$$

DELIMITER ;
Процедура изменения читателя:

DELIMITER $$

CREATE PROCEDURE `edit_reader`(edit_id int, new_name varchar(50), new_phone varchar(14), new_birthday date)

begin

select new_phone regexp '\\+7\\([:digit:]{3}\\)[:digit:]{7}$' into @phone_in_right_format;

if @phone_in_right_format = 0 then select 'error' as result, 'введите телефон в формате +7(XXX)XXXXXXX' as detail;

else

update readers r set `r`.`name` = new_name, `r`.`phone` = new_phone, `r`.`birthday` = date_format(new_birthday, '%d/%m/%Y') where `r`.`id` = edit_id;

end if;

end$$

DELIMITER ;
Процедура добавления заявки:

DELIMITER $$

CREATE PROCEDURE `add_slip`(reader int, timefrom date, timeto date)

begin

if timefrom > timeto then select 'error' as result, 'дата выдачи позднее даты возврата' as detail;

else

insert into slips values (default, reader, date_format(timefrom, '%d/%m/%Y'), date_format(timeto, '%d/%m/%Y'));

select id from slips order by 1 desc;

end if;

end$$

DELIMITER ;
Процедура изменения деталей заявки:

DELIMITER $$

CREATE PROCEDURE `add_slip_nfo`(slip int, book int)

begin

select count(*) from slips_info si where si.slip = slip into @books_in_slip;
if @books_in_slip >= 5 then select 'error' as result, 'одному читателю можно выдать не более 5 книг' as detail;

else

insert into slips_info values (default, slip, book);

select 'success' as result, 'книга внесена в читательское требование' as detail;

end if;

end$$

DELIMITER ;
Запросы для отчетов используются в коде, поэтому содержат переменные, значения которых могут менять результат.

Отчет А:

select month(str_to_date(s.timefrom, '%d/%m/%Y')) as month, count(*) as count from slips s

join slips_info si on(si.slip = s.id)

join readers r on(s.reader = r.id)

join books b on(si.book = b.id)

where year(str_to_date(s.timefrom, '%d/%m/%Y')) = $year

group by month order by 1

где $year вводится пользователем.
Отчет В:

select rr.name as readroom, b.author, b.name as book, year(now())-(year) as age from books b

join readrooms rr on (b.readroom = rr.id)

group by readroom
Отчет С:

select r.name as readroom from books b join readrooms r on(b.readroom = r.id)

    where type in ($list_of_types)

    and readroom not in(select readroom from books b join readrooms r on(b.readroom = r.id) where type in (select id from types where id not in($list_of_types)))

    group by readroom having count(distinct type) = $count_of_types

где $list_of_types - перечень типов, заданных пользователем, а $count_of_types - их количество.
Отчет D:

select b.author, b.name, count(s.id) as count from slips s

join slips_info si on s.id=si.slip

join books b on si.book=b.id

where month(now()) - month(str_to_date(s.timefrom, '%d/%m/%Y')) = 1

group by b.name

order by 3 desc
Приложение 2. Код веб-приложения


index.php:



    

        


                
  • читательские требования


  •             
  • читальные залы


  •             
  • области знаний


  •             
  • читатели


  •             
  • книги


  •             
  • отчеты


  •         


    

    

        

БИБЛИОТЕКА



        
База данных, которая содержит информацию о работе библиотеки.


        
Библиотека состоит из нескольких читальных залов (зал художественной литературы, зал технической литературы, зал иностранной литературы).

            Библиотекари выдают книги читателям.


        
Необходимо вести учет книг, имеющихся в библиотеке и книг, выданных читателям. Необходимо вести учет посещений библиотеки читателями.


    


написать администратору сайта