Физическое проектирование БД

Мы условились не привязываться к конкретной СУБД и выполнять описание логической схемы БД на SQL-92.

Приведём фрагмент описания схемы БД на DDL:

Отношение POSTS (должности):

CREATE TABLE Posts (

p_id INTEGER PRIMARY KEY,

p_post VARCHAR(30) NOT NULL,

p_salary FLOAT NOT NULL);

Отношение ROOMS (комнаты):

CREATE TABLE Rooms (

r_no INT PRIMARY KEY,

r_tel VARCHAR (10),

UNIQUE(r_no, r_tel));

Отношение EMPLOYEES (сотрудники):

CREATE TABLE Employees (

e_id INTEGER PRIMARY KEY,

e_fname VARCHAR(20) NOT NULL,

e_lname VARCHAR(30) NOT NULL,

e_born DATE,

e_sex CHAR(1) NOT NULL,

e_post INT REFERENCES posts,

e_room INT,

e_tel VARCHAR(10),

e_inn CHAR(12) NOT NULL,

e_passp CHAR(12) NOT NULL,

e_org VARCHAR(30) NOT NULL,

e_pdate DATE NOT NULL,

e_addr VARCHAR(50),

FOREIGN KEY(e_room,e_tel) REFERENCES Rooms(r_no,r_tel));

Другие отношения описываются аналогично.

Права доступа пользователей, описанные в п. 2.4.4, предоставляются с помощью команды GRANT. Рассмотрим для примера права сотрудника компании user1, который принимает и обслуживает заказы. Права доступа к отношениям CUSTOMERS, ORDERS, ITEMS могут быть описаны следующим образом:

grant insert, update on customers to user1;

grant insert, update, delete on orders to user1;

grant insert, update, delete on items to user1;

Для реализации частичного доступа к отношению BOOKS следует создать соответствующее представление и предоставить доступ к этому представлению:

create view goods (id, title, circul, price, rest)

as select b_contract, b_title, b_circul, b_price, b_rest

from books;

grant select on goods to user1;

Приведём примеры нескольких готовых запросов:

Список всех текущих проектов (книг, находящихся в печати и в продаже):

create view edits as

select b_contract, b_title, b_date

from books

where b_rest is null or b_rest > 0;

Список редакторов, работающих над книгами:

create view edits (title, fname, lname) as

select b_title, e_fname, e_lname /*ответственный редактор*/

from books, employees e

where b_edit=e_id and

(b_publ is null or b_publ > sysdate);

union /*sysdate – текущая дата*/

select b_title, a_fname, a_lname

from books, employees e, editors d

where b.b_contract=d.b_id and d.e_id=a.e_id and

(b_publ is null or b_publ > sysdate)

order by 1;

Определение общей прибыли от продаж по текущим проектам:

create view edits (title, total) as

select b_title, (circul–rest)*price–advance

from books

where b_rest is null or b_rest > 0;

Анализ готовых запросов показывает, что для повышения эффективности работы с данными необходимо создать индексы для всех внешних ключей (и всех первичных ключей, если выбранная СУБД не создаёт их автоматически). Приведём примеры создания индексов:

CREATE INDEX e_posts ON Employees(e_post);

CREATE INDEX b_editors ON Books(b_edit);

CREATE UNIQUE INDEX r_tel ON Rooms(r_no,r_tel);

Пример выполнения запросов на СУБД Microsoft Access

Запустите MS Access. Создайте новую БД с наименованием library.mdb. В окне БД выберите вкладку «Запросы» и нажмите кнопку «Создать». Выберите «Конструктор», затем закрыв диалог добавления таблиц и запросов кнопкой «Закрыть» перейдите в режим SQL. В текстовом редакторе SQL-кода наберите свой запрос, выполните его и сохраните его с осмысленным названием.

Аналогично создайте и выполните остальные запросы.

Перейдите на вкладку «Таблицы» и убедитесь, что таблицы созданы. Выбрав таблицу можно посмотреть и исправить её структуру через «Конструктор», а в режиме «Таблица» можно ввести данные.

Через меню «Сервис» - «Схема данных» можно увидеть аналог ER-диаграммы


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: