2014-04-01 197 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