2014-04-01 164 views
1

在收集和分析需求阶段,应用程序的用户告诉我,很多概念应该被历史化。然后我想实现它以这样的方式数据历史化

假设有以历史化的被叫用户信息表,

create table user_details(

    id int, 
    mail varchar(50), 
    telephone varchar(50), 
    fax varchar(50), 
    dateFrom date, 
    dateTo date, 
    primary key(id,dateFrom) 

); 

与最后两个领域,我认为管理这个实体的历史化。 对此有何建议? 这是管理它的更好方法吗?

回答

1

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