Данные к лекции 6 (файл doc)

advertisement
Инфологическое проектирование
Анализ предметной области.
База данных создаётся для информационной поддержки
деятельности научно-технической библиотеки.
БД должна обеспечивать:
 ведение автоматизированного учёта выдачи/приёма литературы;
 ведение очередей на литературу (по заказам);
 учёт рейтинга изданий (количество читателей и дата последней выдачи);
 поиск литературы по требуемым разделу, теме, автору,
ключевому слову (с заданием интересующего периода);
 составление списков должников по годам.
Выделим базовые сущности этой предметной области:
Читатели. Атрибуты читателей: ФИО, дата рождения, телефон,
адрес, паспортные данные. Для читателей необходимо
хранить список взятых и заказанных книг.
Разделы (ББК). Атрибуты: шифр, название.
Книги. Атрибуты книг: название, авторы, количество книг в
библиотеке, издательство, город, год выпуска, количество
страниц, дата последней выдачи. Для книг нужно вычислять и хранить их рейтинг, принадлежность к определенному разделу.
Для составления очередей на книгу и списка должников
связи читатель ― книга (заказать и читать) должны содержать номер и дату заказа.
ER-диаграмма приведена на рис. 1.
ЧИТАТЕЛИ
N
K
читать
КНИГИ
М
N
заказать
1
содержать
N
РАЗДЕЛЫ
Рис. 1. ER-диаграмма библиотеки
Анализ информационных задач
и круга пользователей системы
Система создаётся для обслуживания следующих групп
пользователей:
 читатели;
 сотрудники, осуществляющие выдачу книг;
 сотрудники отдела комплектации, осуществляющие регистрацию поступления книг в библиотеку.
Определим границы информационной поддержки пользователей:
1) Функциональные возможности:
 ведение БД (запись, чтение, модификация, удаление в
архив);
 обеспечение логической непротиворечивости БД;
 обеспечение защиты данных от несанкционированного
или случайного доступа (определение прав доступа);
 реализация наиболее часто встречающихся запросов в
готовом виде.
2) Готовые запросы:
 выдача и возвращение книги читателем;
 добавление/удаление заказа на книгу;
 добавление/удаление книги;
 просмотр списка должников с указание взятых книг;
 поиск книги по разным критериям.
Логическое проектирование реляционной БД
Преобразование ER–диаграммы в схему базы данных
На основе ранее созданной ER-диаграммы построим схему БД:
ЧИТАТЕЛИ
Абонемент
идентификатор
читателя
КНИГИ
идентификатор
книги
идентификатор
раздела
Заказы
РАЗДЕЛЫ
Рис. 2. Схема БД "Библиотека"
Составление реляционных отношений:
Отношение Читатели (readers)
Номер читательского
r_id
N(6) Первичный ключ
билета
ФИО
r_name C(50) Обязательное поле
Пол
r_sex
C(1) Обязательное поле
Паспортные данные r_pasport C(80) Обязательное поле
Дата рождения
r_born
D
Обязательное поле
Адрес
r_addr
C(60) Обязательное поле
Телефон
r_tel
C(30)
Отношение Разделы (partitions):
Шифр раздела
p_code
C(10) Первичный ключ
Название
p_name C(50) Обязательное поле
Отношение Книги (books)
Идентификатор
Суррогатный первичb_id
N(10)
книги
ный ключ
Название книги b_name
C(100) Обязательное поле
Авторы книги
b_author
C(100) Многозначное поле
Издательство
b_publisher С(30) Обязательное поле
Город
b_city
C(30) Обязательное поле
Обязательное поле,
Год выпуска
b_year
N(4)
больше 1800
Количество
Обязательное поле,
b_quantity N(3)
экземпляров
больше 0
Количество
Обязательное поле,
b_pages
N(5)
страниц
больше 0
Обязательное поле,
Рейтинг
b_rating
N(5)
по умолчанию 0
Дата последней
b_lastdate D
выдачи
Внешний ключ
Шифр раздела
p_code
C(10)
(partitions)
Отношение Заказы книг (book_order):
Дата заказа
bdate
D
Обязательное поле
Идентификатор
Внешний ключ Униr_id
N(6)
читателя
(readers)
кальная
совоИдентификатор
Внешний ключ купb_id
N(10)
ность
книги
(books)
полей
Отношение Абонемент (Abonement):
Идентификатор книги
b_id N(10) Внешний ключ (books)
Дата, когда взяли
bdate D
Обязательное поле
Идентификатор читателя r_id
N(6) Внешний ключ (readers)
Дата, когда вернули
edate D
Нормализация полученных отношений (до 4 НФ)
1 НФ:
Для приведения таблиц к 1НФ необходимо разбить сложные атрибуты на простые, а многозначные атрибуты вынести в
отдельные отношения.
Но мы не будем выносить многозначный атрибут “авторы” отношения “книги” в отдельное отношение, т.к. для технической литературы поиск всегда происходит по первому автору, а остальные могут не учитываться.
2 НФ:
В нашей базе данных составные первичные ключи имеет
отношение “заказы книг”. Неключевые атрибуты этого отношения функционально полно зависят от первичных ключей.
3 НФ:
В отношении "Книги" присутствует транзитивная зависимость Книга -> Издательство -> Город. Вынесем её в отдельные
отношения "Издательства" и "Города".
4 НФ:
Отношения данной базы данных не нарушают требований
4НФ, т.к. в них нет многозначных зависимостей.
После нормализации из таблицы "Книги" выделились три
таблицы:
Город
Отношение Города (City)
c_name C(30) Первичный ключ
Отношение Издательства (publishers)
Издательство
p_name С(30) Обязательное поле
Город
p_city
C(30) Внешний ключ
Отношение Книги (books)
Идентификатор
Суррогатный первичb_id
N(10)
книги
ный ключ
Название книги
b_name
C(100) Обязательное поле
Авторы книги
b_author
C(100) Многозначное поле
Издательство
b_name
С(30) Внешний ключ
Обязательное поле,
Год выпуска
b_year
N(4)
больше 1800
Количество экОбязательное поле,
b_quantity N(3)
земпляров
больше 0
Количество страОбязательное поле,
b_pages
N(5)
ниц
больше 0
Обязательное поле,
Рейтинг
b_rating
N(5)
по умолчанию 0
Дата последней
b_lastdate D
выдачи
Внешний ключ
Шифр раздела
p_code
C(20)
(partitions)
Схема БД после нормализации приведена на рис. 3.
ГОРОДА
(city)
ИЗДАТЕЛЬСТВА
(publishers)
название города
название
издательства
ЧИТАТЕЛИ
(readers)
идентификатор
читателя
Абонемент
(abonement)
идентификатор
книги
КНИГИ
(books)
идентификатор
раздела
Заказы (book_orders)
РАЗДЕЛЫ
(partitions)
Рис. 2. Схема БД "Библиотека" после нормализации
Определение дополнительных ограничений целостности
1. Количество книг на руках не может превышать общего количества книг.
2. Последний экземпляр не выдается на руки.
Эти ограничения целостности нельзя реализовать в схеме БД,
поэтому мы реализуем это проверкой с помощью запросов.
Права доступа к таблицам для групп пользователей
Таблицы
Города (city)
Издательства
(publishers)
Разделы (partitions)
Книги (books)
Читатели (readers)
Абонемент
(abonement)
Заказы (book_order)
Группы пользователей (роли)
Сотрудники отдела Сотрудники отдела
комплектации
выдачи
SIUD
S
SIUD
S
SIUD
SIUD
Читатели
S
S
S
SU1
SUID
SUID
S
S
SIUD
SI
сотрудники отдела выдачи имеют право изменять поля
«рейтинг» и «дата последней выдачи» в таблице "Книги".
1)
Реализация проекта базы данных
Создание таблиц:
1. «Читатели»
create table readers(
r_id
numeric(6) primary key,
r_name
varchar(50) not null,
r_born
date not null,
r_sex
char(1) not null,
r_pasport varchar(80) not null,
r_addr
varchar(60) not null,
r_tel
varchar(30)
);
2. «Разделы»
create table partitions(
p_code varchar(10) not null primary key,
p_name varchar(50) not null
);
3. "Города"
create table city(
b_name varchar(30) primary key);
4. "Издательства"
create table publishers(
p_name varchar(30) primary key,
p_city varchar(30) references city);
5. «Книги»
create table books(
b_id
numeric(10) not null primary key,
b_name
varchar(100) not null,
b_authors varchar(100) not null,
b_publisher varchar(30) not null
references publishers,
b_quantity numeric(3) not null,
b_pages
numeric(5) not null,
b_rating numeric(5) not null default '0',
b_lastdate date,
p_code varchar(10) not null
references partitions,
CHECK (b_quantity > 0)
);
6. «Заказы книг»
create table book_order(
b_date date not null,
r_id numeric(6) not null references readers,
b_id numeric(10) not null references books,
unique(r_id, b_id)
);
7. «Абонемент»
create table abonement(
bdate date not null,
r_id
numeric(6) not null references readers,
b_id
numeric(10) not null references books,
edate date
);
Для задания прав доступа к таблицам введем три роли
(role), которые будут соответствовать заданным группам пользователей:
1. Сотрудники, выдающие/ принимающие книги:
create role employee;
grant all on readers
to employee;
grant select on partitions to employee;
grant select on city
to employee;
grant select on publishers to employee;
grant select, update (b_rating, b_lastdate)
on books
to employee;
grant all on book_order
to employee;
grant all on abonement
to employee;
2. Сотрудники, пополняющие базу данных книг:
create role staff;
grant all on partitions to staff;
grant all on books
to staff;
grant all on city
to staff;
grant all on publishers to staff;
3. Читатели:
create role reader;
grant select on partitions to reader;
grant select on city
to reader;
grant select on publishers to reader;
grant select on books
to reader;
grant select, insert on book_order to reader;
Теперь добавление пользователя к какой-либо группе осуществляется запросом:
grant <роль> to <пользователь>;
Готовые запросы:
1) Список должников (должниками будут считаться читатели,
взявшие и не вернувшие книгу в течение 14 дней):
a) Задолженность определенного читателя:
select * from abomement
where bdate+14 < sysdate
and edate is null
and r_id = <id читателя>;
b) Книги, которые не вернули в положенный срок:
select * from books
where b_id IN (select b_id from abonement
where
bdate+14 < sysdate
and edate is null);
2) Выдача книг:
update books
set b_quantity = b_quantity - 1,
b_rating = b_rating + 1,
b_lastdate = trunc(sysdate)
where b_id = <id книги>
and b_quantity > 1;
insert into abonement (bdate, r_id, b_id)
values(trunc(sysdate), <id читателя>,
<id книги>);
3) Возврат книг:
update books set b_quantity = b_quantity + 1
where b_id = <id книги>;
update abonement set edate = trunc(sysdate)
where r_id = <id читателя>
and b_id = <id книги>;
4) Проверка того, что выдано столько книг, сколько есть в библиотеке, и не больше:
select *
from books b
where b_quantity >= (select count(*)
from abonement a
where a.b_id = b.b_id
and edate is null);
Download