Файл: Курсовая работа по дисциплине Базы и хранилища данных Разработка базы данных для предметной области Библиотека.docx
Добавлен: 04.12.2023
Просмотров: 41
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Чтобы получить отчет, нужно ввести входные данные в поле, если они предусмотрены, и нажать кнопку «выгрузить».
Рисунок 14. Отчет А
Отчёт с выгрузкой количества выдач по месяцам в заданном году:
Рисунок 15. Отчет B
Самые старые книги по читальным залам:
Рисунок 16. Отчет C
Зал, в котором есть книги только выбранных пользователем типов (ни больше, ни меньше):
Рисунок 17. Отчет D
Пять самых популярных книг:
Код всех процедур и самого веб-приложения приведен в приложениях 1 и 2.
Заключение
База данных - очень мощный инструмент, позволяющий управлять огромным количеством информации, использовать её и анализировать.
Так же с помощью базы данных можно организовать доступ к информации через большое количество программных интерфейсов, устроенных совершенно по-разному, и дающих пользователю одну и ту же информацию в разных представлениях.
Во время выполнения курсовой работы мною были освоены методы анализа предметной области и разные виды проектирования базы данных (инфологическое, даталогическое, физическое), был получен полезный опыт разработки приложения для работы с данными.
Данная курсовая работа позволила автоматизировать учет книг и выдачу книг читателям в библиотеке.
БД позволяет удобно управлять списками читателей и книг, делить книги на категории с точки зрения жанра и с точки зрения их физического расположения в библиотеке, а так же формировать различные отчеты, которые будут полезны при инвентаризациях и аудитах.
Библиография
Основная литература
-
И.П. Карпова. Базы данных: Учебное пособие. СПб: Питер, 2013г. – 240с.
-
М.П. Малыхина. Базы данных: основы, проектирование, использование. 2-е изд. СПб: БХВ-Петербург, 2007.
-
В.В. Кирилов, Г.Ю. Громов. Введение в реляционные базы данных. – СПб.:БХВ-Петербург, 2009г. – 464с.
Дополнительная литература
-
Т. Конноли, К. Бегг. Базы данных: проектирование, реализация и сопровождение. Теория и практика. Вильямс, 2003г – 1440с. -
Г. Хансен, Дж. Хансен. Базы данных: разработка и управление. М: Бином, 1999г. – 704с.
-
Г. Гарсиа-Молина, Дж. Ульман, Дж. Уидом. Системы баз данных. Полный курс. Вильямс, 2003г. – 1088с.
Интернет-источники
-
Справочник по HTML и CSS: https://www.w3.org/Style/Examples/011/firstcss.ru.html -
Документация MySQL: https://dev.mysql.com/doc/refman/8.0/en/ -
Документация 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:
БИБЛИОТЕКА
База данных, которая содержит информацию о работе библиотеки.
Библиотека состоит из нескольких читальных залов (зал художественной литературы, зал технической литературы, зал иностранной литературы).
Библиотекари выдают книги читателям.
Необходимо вести учет книг, имеющихся в библиотеке и книг, выданных читателям. Необходимо вести учет посещений библиотеки читателями.