它可能會工作,但現在的問題是DBMS通常不會強制執行時間主鍵約束或時間參照完整性約束。
我會做這樣的(在T-SQL語法):
CREATE TABLE USER
(
id_user詮釋不爲空標識(1,1),
natural_key VARCHAR(50)NOT NULL
)
;
ALTER TABLE USER
ADD CONSTRAINT [XPK_user_iduser]
PRIMARY KEY CLUSTERED(id_user ASC)
GO
ALTER TABLE USER
ADD CONSTRAINT [XAK1_user_naturalkey]
UNIQUE(natural_key ASC)
GO
CREATE TABLE USER_DETAIL
(
id_user詮釋不爲空,
郵件VARCHAR(50),
電話VARCHAR(50),
傳真VARCHAR(50),
dateFrom日期不爲空,
dateTo日期
) ;
ALTER TABLE USER_DETAIL
ADD CONSTRAINT [XPK_userdetail_1]
PRIMARY KEY CLUSTERED(id_user ASC,dateFrom ASC)
GO
最後這裏RI:
ALTER TABLE USER_DETAIL
ADD CONSTRAINT [ XFK_userdetail_user_1]
FOREIGN KEY(id_user)REFERENCES USER(id_user)
ON DELETE NO ACTI ON
ON UPDATE NO ACTION
GO
此構造不利於停止所有anomalities但至少沒有可能具有相同的開始時間兩個元。
當然,您可以創建一個表USER_DETAIL和USER_DETAIL_HIST,後者將包含早期時段的值。您的USER_DETAIL表只能包含當前記錄。
我會再創建最終用戶應用的以下觀點:
CREATE VIEW USER_DETAIL_TOT AS
SELECT id_user,郵件,電話,傳真,dateFrom,dateTo, '當前' 作爲rowStatus
FROM USER_DETAIL
UNION ALL
SELECT id_user,郵件,電話,傳真,dateFrom,dateTo, '歷史' 作爲rowStatus
FROM USER_DETAIL_HIST
GO