2013-01-09 79 views
1

在我的應用程序中,我有一組對象在整個應用程序生命週期中保持活動狀態,我需要創建它們的歷史數據庫。正確建模數據庫中的歷史記錄

這些對象是用Hibernate批註註釋的Java/Scala類層次結構的實例,我在應用程序中使用它來在啓動時加載它們。幸運的是所有的類都包含一個時間戳,這意味着我不需要改變對象模型來創建歷史記錄。

什麼是最合適的方法:

  1. 使用休眠沒有註釋和提供外部XML映射,這是相同的,除了主鍵的註釋中的一個(這是現在由以下組成的組合鍵以前的主鍵+時間戳)

  2. 使用其他類的歷史記錄(這聽起來非常複雜,因爲我確實有一個類的層次結構,而不是一個類,我必須繼承我的HistoricalRecordClass的每個類型的記錄,因爲我想建立它)。仍然使用Hibernate

  3. 使用完全不同的方法(請不是我不喜歡運籌學和管理學,它僅僅是一個方便易用的物質)

一些注意事項:

存儲歷史記錄的目標用戶通過一個GUI就可以訪問特定數據的實時值或歷史數值,只需指定一個日期即可。

回答

1

您打算如何使用歷史記錄?最簡單的解決方案是將它們序列化爲JSON並將它們記錄到文件中。

我從來沒有將hibernate xml映射與hibernate註釋結合起來,但是如果它起作用,聽起來比攜帶兩個並行對象模型更有吸引力。

如果您需要能夠在任何時間點重新創建應用程序狀態,那麼您或多或少地將它們寫入數據庫(由於快速隨機訪問)。你可以作弊,並有一個「歷史」表,其中包含id +時間戳+類型的組合鍵,然後是一個「json」字段,您只需將其整理並保存即可。這將有助於:a)攜帶一個歷史表而不是一堆克隆表,並且b)如果模式改變(例如,利用JSON的開放模式性質),則給予一些靈活性

但是由於它是存檔數據不同的使用模式(你只是讀/寫整個記錄),我會考慮一些其他的存儲方式,而不是像實時數據一樣嚴格的模式。

這是一個很好的「一次寫入」範例的應用程序......你有Hadoop可用嗎? ;)

+0

我對任何解決方案都非常開放。我沒有Hadoop,Hadoop會帶給我什麼?我正在構建財務數據的歷史數據... – Edmondo1984

+0

哦,Hadoop只是一個很好的大數據存儲,可以將數據轉儲到數據庫中,而不用擔心。但這可能是巨大的矯枉過正。但好的一點是,它真的讓我的眼睛看起來像「一次寫入」範例......即你一次寫入數據,永遠不會更新它......只能讀取。這是你的歷史數據。如果是這種情況,你可以進行各種強大的簡化。 – Rob

+0

非常好,請你指出一個鏈接到那個? – Edmondo1984