Validité temporelle et relations clés primaires / étrangères

11

J'ai lu plusieurs des tutoriels oracle qui montrent la validité temporelle et les caractéristiques temporelles. Cependant, dans les exemples que j'ai lus, aucune clé primaire n'est utilisée dans les tables de démonstration.

http://docs.oracle.com/cd/E16655_01/appdev.121/e17620/adfns_design.htm#ADFNS1005 http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/12c/r1/ilm /temporal/temporal.html

Faut-il ajouter des clés primaires à ces tables? Je demande parce que je me demande comment une de ces tables temporelles devrait être référencée par une autre table. Puis-je ajouter une clé étrangère d'une table temporelle à une autre?

Si j'ajoute une propriété pk / clé étrangère, puis met à jour le référencé dans le tableau avec le pk, le tableau avec le fk pointe vers un enregistrement qui n'est plus pertinent .... les données temporelles cassent-elles la clé primaire normale - clé étrangère des relations? Et si oui, comment cela affecte-t-il les performances, dois-je simplement utiliser une colonne normale comme «clé étrangère» et sélectionner la bonne pour une période de temps référencée dans une requête?

Quelqu'un connaît-il ou a-t-il des exemples ou des tutoriels à portée de main qui montrent des données temporelles avec une utilisation pk / fk normale ou pseudo-normale?

Merci

user1778606
la source

Réponses:

2

Malheureusement, SQL ou ses implémentations présentes dans tous les produits SGBDR ne prennent pas totalement en charge les relations temporelles.

Seuls Teradata et DB2 ont certaines fonctionnalités implémentant des contraintes ayant du temps dans les deux colonnes ou plus.

Mon exemple:

SET SCHÉMA TEST;

CRÉER UN PRODUIT DE TABLE (
product_ID INT NOT NULL,
fournisseur NVARCHAR (50),
PRIMARY KEY (product_ID)
);

CRÉER UNE CAMPAGNE DE TABLE (
campagne_ID INT NON NULLE,
product_ID INT NON NULLE,
prix DÉCIMAL,
CLÉ PRIMAIRE (campagne_ID)
)
;

ALTER TABLE CAMPAIGN
ADD CONSTRAINT XFK_campaign_productid
FOREIGN KEY (product_ID) REFERENCES PRODUCT (product_id)
ON DELETE NO ACTION;

Si vous ajoutez des colonnes temporelles business_startdate et business_enddate et éventuellement
transaction_starttime et transaction_endtime, vous ne pouvez plus appliquer l'intégrité référentielle.

Vous devrez peut-être implémenter des déclencheurs ou des procédures stockées ou un codage au niveau de l'application si vous souhaitez implémenter une contrainte comme celle-ci:

CREATE TABLE CAMPAGNE (
CAMPAIGN_ID INT NOT NULL,
Product_ID INT NOT NULL,
DATE business_startdate NOT NULL,
DATE business_enddate NOT NULL,
transaction_starttime TIMESTAMP NOT NULL,
transaction_endtime TIMESTAMP NOT NULL,
prix DECIMAL,
clé primaire (CAMPAIGN_ID, business_startdate, transaction_starttime)
)
;

Pour DB2, il existe une contrainte de clé primaire temporelle dans la syntaxe suivante:

CREATE TABLE CAMPAIGN (
campaign_ID INT NOT NULL,
product_ID INT NOT NULL,
business_startdate DATE NOT NULL,
business_enddate DATE NOT NULL,
prix DECIMAL,
PERIOD BUSINESS_TIME (business_startdate, business_enddate),
KEY PRIMARY KEY (campaign_ID, BUSINESS_TIME SANS OVERLAPS)
)
;

Analyste
la source
Pouvez-vous fournir un lien sur les fonctionnalités implémentant des contraintes ayant du temps dans les deux colonnes ou plus?
AK
@AlexKuznetsov voici le lien ibm.com/developerworks/data/library/techarticle/…
Analyste