2014-10-31 81 views
0

我有一個(SQL Server)數據庫,用於跟蹤表上的更改;客戶的要求是能夠查看任何時間點的「圖片」,並指定要求的日期。 我到目前爲止所做的是在Log trigger的想法之後實施HistoryTable,並使用數據庫觸發器來存儲歷史數據。數據庫記錄有關n-m關係變化的信息

現在,需求發生了變化,我需要爲原始表添加多對多(n-m)關係。當然,鏈接的數據集(n-m關係)也應該「版本化」,並隨着時間的變化而變化爲原始表格。

我的第一個想法是將n-m關係與主表中的「僞ID」相關聯,即:正常(int)字段,而不是主鍵(不隨時間變化)。這樣一來,我可以改變這個ID隨着時間的推移,例如:

版本1:

Version 1 
ID RelID Data 
5 5  Version 1 

Version 2 
ID RelID Data 
5 5  Version 2 

Version 3 
ID RelID Data 
5 6  Version 3 

在這個例子中,納米關係沒有版本1和2之間變化,但在第3版改變。

這是正常的,但我的問題是:

  • 每當納米關係版本的變化,我怎麼能得到一個新的RELID是在表中獨特之處?
  • 另一種選擇:我可以將n-m關係同時引用到ID和RelID(確實是唯一的)嗎?
  • 有沒有比我更聰明的解決方案?

預先感謝您的任何幫助

回答

1

這種情況聽起來像它可以很容易地適應緩慢變化維度的數據倉庫的概念。通常,2型緩慢變化的尺寸被認爲是最有用的。這些記錄每行版本的開始和結束日期,當前行僅存儲NULL的結束日期。

基本上,您會將其他列添加到橋接表以記錄該行版本的開始日期和結束日期。如果EndDate是NULL,那麼您知道這是當前的行版本。

所以,你的表最終會看起來像:

ID | RelID | StartDate | EndDate 
----+-------+------------+------------ 
05 | 06 | 2014-10-01 | NULL 
05 | 05 | 2014-09-10 | 2014-10-01 
05 | 03 | 2014-09-10 | NULL 

從這個數據可以告訴大家,ID 05是有關RELID 05至2014-10-01並隨後將其與RELID 06和它仍然是關係到RELID 03.

然後,當你需要的電流的關係數據,你可以簡單地說

SELECT * 
FROM Table 
WHERE EndDate IS NULL 

,如果你回頭看歷史,你可以說

SELECT * 
FROM Table 
WHERE @selectionDate BETWEEN StartDate AND COALESCE(EndDate,GETDATE()) 

不知道更多關於您的數據結構我不知道這是否適合您嘗試解決的問題。但通常多對多關係需要在兩個實際記錄表之間建立一個橋接表來創建適當的關係,而Type-2緩慢變化的維度是對數據倉庫中的行進行版本控制的可靠和真實的方法,可以應用於任何需要歷史版本記錄的地方。

+1

我發現你的答案符合[this](http://stackoverflow.com/questions/19719110/data-warehouse-slowly-changing-dimensions-with-many-to-many-relationships)在SO上的相關答案。順便說一下,所附的[文章](http://www.cibis.org.je/index.php/blog/2010/02/18/modelling-loading-a-slowly-changing-many-to-many-關係/)也是一個非常有趣的閱讀。謝謝。 – Nova 2014-11-20 07:55:12