Файл: Курсовая работа по дисциплине Базы и хранилища данных Разработка базы данных для предметной области Библиотека.docx

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 04.12.2023

Просмотров: 40

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Так как одна книга может находиться только в одном читальном зале, и принадлежать только одной области знаний (а иного не было определено заданием), то нет никакой необходимости выделять связь «книга : область знаний» и связь «книга : читальный зал» в отдельные отношения. В таблице «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 показаны формы получения отчетов, которые нужно было реализовать по заданию.