Platnost zaznamu v ciselniku jeste jednou

Michal Kubecek mike na mk-sys.cz
Pondělí Červenec 21 10:07:48 CEST 2003


On Mon, Jul 21, 2003 at 07:37:04AM +0200, "Zíka Aleš, Ing." wrote:

> 	Trochu jsem si s tim hral a vyvstaly mi dalsi dotazy:
> 	Když to takhle udelam, nemuze byt uz PK jen cislo zakaznika, protoze
> se v tabulce vyskytuje vicekrat, ale musim PK nejak poslepovat z cisla
> zakaznika + atributu od - do.
> 	Druhy problem mam s RI. Protoze cislo zakaznika uz neni unikatni
> atribut, nelze na nej referencovat cizi klic tabulky faktur, aspon ne
> standardni klauzuli FOREIGN KEY ... REFERENCES.

create table CUSTOMERS (
  ID integer not null,
  VALID_SINCE timestamp not null,
  VALID_UNTIL timestamp default null,
...
  primary key (ID,VALID_SINCE)
);

create table DOCUMENTS (
  ID integer not null primary key,
...
  CUSTOMER integer,
  CUSTOMER_VS timestamp,
  foreign key (CUSTOMER,CUSTOMER_VS) references CUSTOMERS(ID,VALID_SINCE)
);

Moc šťastné to ale není. Osobně to dělám tak, že mám dvě tabulky CUSTOMERS
a CUSTOMER_IDENTITIES. V každé je normálně integer ID jako primární klíč.
V tabulce CUSTOMERS jsou jednotlivé instance zákazníků (s časově omezenou
platností) a v CUSTOMER_IDENTITIES jsou zákazníci jako takoví. Každý záznam
v CUSTOMERS má položku IDENTITY, což je odkaz na odpovídající položku
v CUSTOMER_IDENTITIES.

Jiná možnost (ne moc elegantní, ale funkční) je jít cestou nejmenšího odporu
a ke každé faktuře zkopírovat podstatné aktuální údaje zákazníka v okamžiku,
kdy byla vystavena.

                                                            Michal Kubeček


Další informace o konferenci Databases