Relacje czasowe i relacje między kluczem podstawowym a kluczem obcym

11

Przeczytałem kilka samouczków wyroczni, które pokazują ważność czasową i funkcje czasowe. Jednak w przykładach, które przeczytałem, w tabelach demonstracyjnych nie użyto klucza podstawowego.

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

Czy do tych tabel należy dodać klucze podstawowe? Pytam, ponieważ zastanawiam się, w jaki sposób do jednej z tych tabel tymczasowych powinna odwoływać się inna tabela. Czy mogę dodać klucz obcy z jednej tabeli czasowej do drugiej?

Jeśli dodam właściwość pk / klucz obcy, a następnie zaktualizuję odniesienie w tabeli za pomocą pk, tabela z fk wskazuje na rekord, który nie jest już istotny ... czy dane czasowe psują normalny klucz podstawowy - klucz obcy relacje? A jeśli tak, to w jaki sposób wpływa to na wydajność, czy po prostu używam zwykłej kolumny jako „klucza obcego” i wybieram właściwą dla odnośnego okresu w zapytaniu?

Czy ktoś wie lub ma pod ręką jakieś przykłady lub samouczki, które pokazują dane czasowe z normalnym lub pseudo-normalnym użyciem pk / fk?

Dzięki

użytkownik1778606
źródło

Odpowiedzi:

2

Niestety obecny SQL lub jego implementacje we wszystkich produktach RDBMS nie w pełni obsługuje relacje czasowe.

Tylko Teradata i DB2 mają pewne funkcje implementujące ograniczenia mające czas w dwóch lub więcej kolumnach.

Mój przykład:

USTAW TEST SCHEMATU;

UTWÓRZ PRODUKT TABELI (
ID_produktu INT NIE NULL,
dostawca NVARCHAR (50),
KLUCZ PODSTAWOWY (ID_produktu)
);

UTWÓRZ KAMPANIĘ TABELI (ID_
kampanii INT NIE NULL,
ID_produktu INT NIE NULL,
cena DECIMAL,
KLUCZ PODSTAWOWY (ID_ kampanii)
)
;

ZMIEŃ
KAMPANIĘ DO KAMPANII DODAJ OGRANICZENIE XFK_campaign_productid
KLUCZ ZAGRANICZNY ( ID_produktu ) REFERENCJE PRODUKT (ID_produktu)
PRZY USUNIĘCIU NIE DZIAŁA ;

Jeśli dodasz kolumny czasowe business_startdate i business_enddate oraz opcjonalnie
transakcja_starttime i transakcja_endtime, nie będzie już można wymuszać integralności referencyjnej.

Może być konieczne wdrożenie wyzwalaczy lub procedur przechowywanych lub kodowania na poziomie aplikacji, jeśli chcesz wdrożyć takie ograniczenie:

CREATE TABLE kampanii (
CAMPAIGN_ID INT NOT NULL,
PRODUCT_ID INT NOT NULL,
DATA business_startdate NOT NULL,
DATA business_enddate NOT NULL,
transaction_starttime TIMESTAMP NOT NULL,
transaction_endtime TIMESTAMP NOT NULL,
DZIESIĘTNY cena,
PRIMARY KEY (CAMPAIGN_ID, business_startdate, transaction_starttime)
)
;

W przypadku bazy danych DB2 istnieje tymczasowa stała klucza podstawowego w następującej składni:

UTWÓRZ KAMPANIĘ STABILNĄ (ID_
kampanii INT NIE NULL,
ID_produktu INT NIE NULL, data_startu
DATA NIE NULL, data_data
biznesu DATA NIE NULL,
cena W DZIESIĘCIU OKRESU BIZNESU_CZASU (data_biznesu, data_biznesu)
,
KLUCZ PODSTAWOWY (identyfikator_badania, BIZNES
)
;

Analityk
źródło
Czy możesz podać link do funkcji implementujących ograniczenia mające czas w dwóch lub więcej kolumnach?
AK
@AlexKuznetsov tutaj jest link ibm.com/developerworks/data/library/techarticle/…
Analityk