它可能会工作,但现在的问题是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