6

當使用符合6NF原則的數據庫標準化時,如何存儲歷史屬性數據?6NF和歷史屬性數據

讓例如說,我們採取this example從@PerformanceDBA但有以下額外要求:

我們需要存儲的歷史數據對我們所有的產品,我們應該 能夠只需輸入一個日期,並得到產品在特定時間的屬性快照。

一個更實用的例子:上述
假設從例子中的磁盤和CPU的是虛擬的,並且用戶可以改變隨意磁盤容量。我們如何修改數據庫,以便我們可以在過去的任何時候(當然是在創建日期之後)檢索給定磁盤的屬性,同時保持5NF視圖足夠快。

事情我考慮

  • 添加時間戳列「CHANGEDATE」每個屬性表(這將導致與子查詢一個相當複雜的查詢,並加入每一個屬性表
  • 爲每個屬性表創建一個單獨的*歷史表(可能會導致大量的表,因爲我們有大約70個屬性分佈在20個產品類型
  • 此外:添加一個索引「電流」列各屬性表加快5NF視圖

任何幫助表示讚賞!


編輯:我知道時間數據庫的概念,但問題是,數據庫引擎我與(PostgreSQL系統)的工作時間延長還沒有完全落實。有沒有時間數據庫的任何建議,

+1

只是要提醒你,我去了沒有歷史記錄表,並使用「從」和我的「實體」的每一行「到」日期的道路。這是我犯的最大錯誤,它把這個項目變成了一場噩夢。它採用了你提到的人員PerformanceDBA的指導,使我能夠理解數據庫的真正含義(即不僅僅是一個對象的存儲桶)。我已經使用更傳統的方法(歷史表/視圖)重寫了該項目,並且在各方面都更好。好吧,沒有太多爭論,但要詳細說明需要大量的文件。 – Mark

+1

這是一個讓我開始改變我如何看待數據庫一般(從視軟件工程師點,到了DBA的角度來看)後: - http://stackoverflow.com/questions/4491173/historical-可審計的數據庫 - 我並不是說這樣做是錯誤的(使用「from」和「to」並且沒有歷史記錄表),但對我而言,它造成了一個大混亂,我永遠不會下降再次路。 – Mark

回答

9

最近批准的SQL:2011標準中加入的功能,讓你用這樣那樣的問題比你所能前處理好。

並不是說你就可以做你想要的時間舞臺上做些什麼,而沒有得到推出的確是一個相當顯著改善一切。

關於它的良好表現是在http://metadata-standards.org/Document-library/Documents-by-number/WG2-N1501-N1550/WG2_N1536_koa046-Temporal-features-in-SQL-standard.pdf

注意,這裏只有在他的SQL產品的這些特點合理支持單一的供應商,另外一個也許是工作就可以了,第三個開闢爲他們的客戶投票通道。

也有的www.linkedin.com一個「時空數據」課題組致力於正是你的主題在眼前。

編輯試圖解決「如何實現這一點沒有時間性的資料庫有什麼建議?「

不要只爲您的模型添加一個日期/時間類型列,第一個原因是您給出的,第二個原因是這個解決方案也是新標準提倡的方案,並且它會促進過渡到可以支持新功能的引擎

因此,添加一個開始日期和結束日期/時間列。不要讓它們都爲空。新標準要求使用它的時間特徵。如果最終MIT(時刻)仍然未知,請使用適用時間類型的最高值,例如9999-12-31。

您不需要爲每個「創建單獨的歷史記錄表」屬性「同樣可能有一個「單一的實體表」,保持「整個實體發生的歷史」。缺點是,這將是很難查詢時實際發生變更的一些特殊屬性(因爲你得到新的歷史行的任何更改任何屬性,可能是複製了相同的屬性值的大多數屬性)。 「單一表格」可能是空間的急切消費者,「每個屬性單獨的歷史記錄」可能是查詢CPU時間的急切消費者。這將是一個平衡的行爲,而平衡恰恰取決於你的具體情況。

不要「添加索引‘當前’列」你的表格。首先,當你的引擎擁有它們時,它們不會幫助你轉換到新的特性,其次,Y/N列是非常糟糕的鑑別器,因此非常差的候選索引。我寧願將開始或結束時間添加到索引中,只要需要查詢那些索引,他們可以期望爲「當前」行贏得相同的勝利,併爲非當前行贏得更好的勝利。

至於數據庫的限制,例如在臨時密鑰,並列入時間RI時間段的時間段不重疊的執行,以及你只是完全在你自己的。按照優先級降序將您需要的代碼寫入觸發器或SPROC或應用程序代碼中。

對您更有幫助?

+0

謝謝,我現在發現了postgresql的時間延長(https://github.com/jeff-davis/PostgreSQL-Temporal/downloads),這似乎是我正在尋找的東西。一些更實際的例子將有助於壽。 – ChrisR

+0

這是最有幫助的!感謝您的優秀建議! – ChrisR