- •Министерство образования и науки Украины
- •Особенности PostgreSql
- •Причины, по которым можно предпочесть PostgreSql
- •Недостатки PostgreSql
- •Ограничения PostgreSql
- •Обзор применения последней версии PostgreSql 8.1.
- •Доступ к базам данных из Java-программ
- •1. Постановка задачи
- •2.Информационная модель
- •3.Проетирование бд
- •Атрибуты сущности и их типы данных
- •Типы связей между сущностями
- •Функциональные зависимости
- •4.Программная реализация.
- •5.Инструкция пользователя
- •6.Тестовый пример
- •7.Выводы:
- •Список литературы
Типы связей между сущностями
Сущность 1 |
Степень связи |
Сущность 2 | |
prodaja |
N :1 |
tovar | |
tovar |
N:1 |
firma_proizvoditelya | |
tovar |
N:1 |
tip_tovara | |
tovar |
1:N |
zakupka | |
zakupka |
1:N |
postavshik |
Функциональные зависимости
Отношение |
Функциональные зависимости |
prodaja |
1 ‑> 2, 1 ‑> 3, 1 ‑> 4 |
tovar |
1 ‑> 2, 1 ‑> 3,1 ‑> 4,1 ‑> 5, 1 ‑> 6,1 ‑> 7, 1 ‑> 8 |
zakupka |
1 ‑> 2, 1 ‑> 3, 1 ‑> 4, 1 ‑> 5, 1 ‑> 6 |
postavshik |
1 ‑> 2, 1 ‑> 3, 1 ‑> 4, 1 ‑> 5, 1 ‑> 6 |
firma_proizvoditelya |
1 ‑> 2, 1 ‑> 3, 1 ‑> 4 |
tip_tovara |
1 ‑> 2 |
В результате мы провели проверку на НФБК, при которой в каждой сущности все атрибуты зависят от первичного ключа, но в то же время не зависят друг от друга.
В результате проведенных выше исследований мы можем составить запросы на создание таблиц:
Создание таблицы tip_tovara:
create table tip_tovara
(
nomer_tipa int primary key,
nazvanie_tipa char(30)
) ;
Создание таблицы firma_proizvoditelya:
create table firma_proizvoditelya(
nomer_firmi int primary key,
nazvanie_firmi char(30) UNIQUE,
opisanie_firmi varchar,
ssilka char(30)
);
Создание таблицы tovar:
create table tovar(
id_tovara int primary key,
id_tipa int references "tip_tovara"("nomer_tipa"),
id_firmi int references "firma_proizvoditelya"("nomer_firmi"),
nazvanie_tovara text NOT NULL,
model char(10),
opisanie text,
tsena int4 NOT NULL,
kolichestvo_imeushihsa int check(kolichestvo_imeushihsa>=0)
);
Создание таблицы postavshik:
create table postavshik
(
id_postavshika int primary key,
firma_postavshika char(15),
strana text,
gorod char(15),
address text,
telefone_number char(20)
);
Создание таблицы prodaja:
create table prodaja(
nomer_cheka int primary key ,
id_tovara int references "tovar"("id_tovara"),
kolichestvo_prodaj int check(kolichestvo_prodaj>0),
data_prodaji date default current_date
);
Создание таблицы zakupka:
create table zakupka(
id_zakupki int primary key,
id_postavki int references "postavshik"("id_postavshika"),
data_zakupki text,
kolichestvo int,
tsena_zakupki float NOT NULL,
id_tovara int references "tovar"("id_tovara")
);
Для правильной обработки информации и при исключении отслеживания количества проданного и закупленного товара составим триггеры:
1.Триггер, позволяющий отслеживать количество имеющихся товаров при продаже:
CREATE FUNCTION Prod()
RETURNS trigger
AS 'BEGIN
update tovar
set kolichestvo_imeushihsa =kolichestvo_imeushihsa-new.kolichestvo_prodaj
where id_tovara = new.id_tovara;
RETURN new;
end;'
LANGUAGE 'plpgsql';
CREATE TRIGGER Prod /*Создать триггер*/
AFTER INSERT /*вызываемый после операции insert*/
ON prodaja /*для таблицы продажи*/
FOR EACH ROW /*для каждого кортежа*/
EXECUTE PROCEDURE Prod(); /*вызвать процедуру*/
2. Аналогичный триггер, позволяющий отслеживать количество имеющихся товаров при закупке:
CREATE FUNCTION Zakup()
RETURNS trigger
AS 'BEGIN
update tovar
set kolichestvo_imeushihsa =kolichestvo_imeushihsa+new.kolichestvo
where id_tovara = new.id_tovara;
RETURN new;
end;'
LANGUAGE 'plpgsql';
CREATE TRIGGER Zakup /*Создать триггер*/
AFTER INSERT /*вызываемый после операции insert*/
ON zakupka /*для таблицы продажи*/
FOR EACH ROW /*для каждого кортежа*/
EXECUTE PROCEDURE Zakup(); /*вызвать процедуру*/