|
|
su.dbms- SU.DBMS ---------------------------------------------------------------------- From : ЏгвЁ«Ё …ўЈҐЁ© ‚ «ҐвЁ®ўЁз 2:5020/400 14 Mar 2003 13:22:22 To : All Subject : постреляционные базы данных, способ реализации в IB/FB --------------------------------------------------------------------------------
Hi All,
Это родилось после детального изучения статьи ООП в РСУБД автор Владимир
Котляревский http://www.ibase.ru/devinfo/oop_rdbms.htm
Данные для описания примеров взяты из данной статьи.
Предпосылки
1.В главе "Хранение более сложных объектов", есть такая фраза: " Hедостатки -
не совсем тривиальна система сохранения и загрузки объектов, есть сложности с
организацией наследования типов." Данный пример показывает как избавиться с
помощью "бубна"(view+trigger's) от сложностью с загрузкой и сохранением
объектов.
2.В Cahe' есть такое свойство если мы наследуем одну таблицу от другой, то
при появлении записи в потомке он автоматически появляется в таблице предка. И
соответственно изменение в потомке атрибутов предка влечет изменение записи в
предке.
Решение задачи:
1.Делаем таблицу наследника с расширением "_R"
2.Делаем View из двух таблиц со всеми полями убирая дублирование PK.
3.Пишем триггера на вставку удаление и изменение данных.
Это позволяет работать с наследованием в РСУБД, как будто это встроенный
механизм. Это-то пример чисто академический, может неоднократно улучшаться,
поддержка множественного наследования, Изменение triger's на более
интеллектуальные, чтобы записи изменялись только для той таблице к которой они
относятся. И т.д.
Далее скрипт.
create domain TOID as integer not null;
create table OBJECTS(
OID TOID primary key,
ClassId TOID,
Name varchar(32),
Description varchar(128),
Deleted smallint,
Creation_date timestamp default 'now',
Change_date timestamp default 'now',
Owner TOID);
create table Orders_R (
OID TOID primary key,
customer TOID,
sum_total NUMERIC(15,2),
foreign key (OID) references OBJECTS on update cascade on delete cascade);
create view Orders (
OID,
ClassId,
Name,
Description,
Deleted,
Creation_date,
Change_date,
Owner,
customer,
sum_total) as
select a.OID,
ClassId,
Name,
Description,
Deleted,
Creation_date,
Change_date,
Owner,
customer,
sum_total
from objects a join orders_r b on
a.oid=b.oid;
set term^;
create trigger Ordes_insert for Orders before insert
as
begin
insert into OBJECTS( OID,
ClassId,
Name,
Description,
Deleted,
Creation_date,
Change_date,
Owner)values(
new.OID,
new.ClassId,
new.Name,
new.Description,
new.Deleted,
new.Creation_date,
new.Change_date,
new.Owner);
insert into orders_r(OID,customer,
sum_total)values(
new.OID,
new.customer,
new.sum_total);
end
^
create trigger Ordes_update for Orders before update
as
begin
update OBJECTS set OID=new.OID,
ClassId=new.ClassId,
Name=new.Name,
Description=new.Description,
Deleted=new.Deleted,
Creation_date=new.Creation_date,
Change_date=new.Change_date,
Owner=new.Owner
where OID=old.OID;
update orders_r set
customer=new.customer,
sum_total=new.sum_total
where OID=new.OID;/*Именно new.OID а не old.OID т.к.
существует cascade update на FK*/
end
^
create trigger Ordes_delete for Orders after delete
as
begin
delete from OBJECTS
where OID=old.OID;
end
^
set term ;^
p.s. Это наверняка очередной велосипед, но как удобен :-).
С уваженим Путилин Евгений.
С уважением Путилин Евгений Валентинович
--- ifmail v.2.15dev5
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /su.dbms/16679ce47f395.html, оценка из 5, голосов 10
|