Временная действительность и отношения первичного / внешнего ключа


11

Я прочитал несколько уроков оракула, которые показывают временную достоверность и временные характеристики. Однако в примерах, которые я прочитал, в демонстрационных таблицах не используется первичный ключ.

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

Должны ли первичные ключи быть добавлены в эти таблицы? Я спрашиваю, потому что мне интересно, как одна из этих временных таблиц должна ссылаться на другую таблицу. Можно ли добавить внешний ключ из одной временной таблицы в другую?

Если я добавлю pk / внешний ключ, а затем обновлю ссылку в таблице на pk, таблица с fk укажет на запись, которая больше не актуальна ... не нарушает ли временные данные нормальный первичный ключ - внешний ключ отношения? И если это так, как это влияет на производительность, могу ли я просто использовать обычный столбец в качестве «внешнего ключа» и выбрать правильный для указанного периода времени в запросе?

Кто-нибудь знает или есть какие-нибудь примеры или учебные пособия, которые показывают временные данные с нормальным или псевдонормальным использованием pk / fk?

Спасибо

Ответы:


2

К сожалению, нынешний SQL или его реализации во всех продуктах СУБД не полностью поддерживают временные отношения.

Только Teradata и DB2 имеют некоторые функции, реализующие ограничения, имеющие время в двух или более столбцах.

Мой пример:

SET SCHEMA TEST;

CREATE TABLE PRODUCT (
product_ID INT NOT NULL,
источник NVARCHAR (50), первичный ключ
(product_ID)
);

CREATE TABLE CAMPAIGN (
campaign_ID INT NOT NULL,
product_ID INT NOT NULL,
цена DECIMAL,
PRIMARY KEY (campaign_ID)
)
;

ALTER TABLE CAMPAIGN
ADD CONSTRAINT XFK_campaign_productid
FOREIGN KEY (product_ID) ССЫЛКИ PRODUCT (product_id)
ON УДАЛИТЬ НЕТ ДЕЙСТВИЙ;

Если вы добавите временные столбцы business_startdate и business_enddate и, по желанию,
Transactions_starttime и Transactions_endtime, вы больше не сможете обеспечить ссылочную целостность.

Возможно, вам придется реализовать триггеры или хранимые процедуры или кодирование на уровне приложения, если вы хотите реализовать такое ограничение:

CREATE TABLE КАМПАНИЯ (
CAMPAIGN_ID INT NOT NULL,
PRODUCT_ID INT NOT NULL,
business_startdate DATE NOT NULL,
business_enddate DATE NOT NULL,
transaction_starttime TIMESTAMP NOT NULL,
transaction_endtime TIMESTAMP NOT NULL,
цена DECIMAL,
PRIMARY KEY (CAMPAIGN_ID, business_startdate, transaction_starttime)
)
;

Для DB2 существует временный первичный ключ, содержащий следующий синтаксис:

CREATE TABLE КАМПАНИЯ (
CAMPAIGN_ID INT NOT NULL,
PRODUCT_ID INT NOT NULL,
business_startdate DATE NOT NULL,
business_enddate DATE NOT NULL,
цена DECIMAL,
СРОК BUSINESS_TIME (business_startdate, business_enddate),
PRIMARY KEY (CAMPAIGN_ID, BUSINESS_TIME без наложений)
)
;


Можете ли вы предоставить ссылку на функции, реализующие ограничения, имеющие время в двух или более столбцах?
AK

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.