|
|
su.dbms- SU.DBMS ---------------------------------------------------------------------- From : ЏгвЁ«Ё …ўЈҐЁ© ‚ «ҐвЁ®ўЁз 2:5020/400 27 Feb 2003 13:25:19 To : Lev Serebryakov Subject : Хранение нескольких версий объекта -- как? -------------------------------------------------------------------------------- Tue Feb 25 2003 10:23, Lev Serebryakov wrote to All: LS> What do you think about sharp blades, All? LS> Задача выглядит очеь стандартной, но решения я нигде найти не смог. LS> Придумал свое решение, но не уверен в том, на сколько оно хорошо... LS> Собственно, задача выглядит так: в базе (реляционной) хранятся объекты. LS> Хранятся они в двух таблицах (типы не важны): LS> CREATE TABLE ObjectCore (ID PRIMARY KEY, prop1, prop2, prop3); LS> CREATE TABLE ObjectProp (ID PRIMARY KEY, ObjectID, PropName, LS> PropValue); LS> То есть, у объектов есть обязательные свойства и дополнительные. LS> Дополнительных может быть 0, а можнт -- много. LS> Хочется хранить версии объектов -- что бы изменение объекта не хатирадо LS> предыдущию информацию. Хочется хранить компактно -- что бы, скажем, при LS> изменении ожного дополнительного свойства не дублировались в новой версии LS> все остальные. Хочется иметь быстрый доступ к последним версиям -- что бы LS> не принципиально медленней варианта без версий (доступ к старым версиям LS> может быть на порядки дольше). Хочется хранить безопасно -- что бы два LS> одновременных изменения происходили в произвольном порядке, но, в LS> результате, появлялись две новые версии -- последняя и предпоследняя. LS> Хочется в еще одну табличку класть дату, автора и комментарий к изменению LS> (это-то как раз самое простое)... LS> Да, хочется все это на стандартном SQL'е, без особенностей Oracle, LS> Скажем. У меня есть рабочая БД, которая это делает. CREATE TABLE ObjectCore (ID,HOWOLD integer, prop1, prop2, prop3,PRIMARY KEY(ID,HOWOLD)); CREATE TABLE ObjectProp (ID , ObjectID, PropName,PRIMARY KEY(ID,HOWOLD) Идея такая HOWOLD=0 это текущая версия объекта. HOWOLD=1 предыдущая. и так далее при update , HowOld=HowOld+1 where HowOld>0. Потом копируеться запись insert into ObjectCore (ID,HOWOLD, prop1, prop2, prop3) select ID,1,prop1, prop2, prop3 from ObjectCore where HOWOLD=0 Все это выполняеться до update. При это выбока последних версии данных просто добавить условиие HOWOLD=0. Hе сильно усложняет. Hо начинаеться свсистопляска при построение отношений, т.е. ссылки на объекты с версиями. С уважением Путилин Евгений Валентинович --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms/16679782a85f0.html, оценка из 5, голосов 10
|