我不知道所有這一切的單一解決方案 - 可能是因爲每個項目是如此不同。然而,這裏是我在過去使用兩種技術:
嵌入的版本和有效性的理念融入到你的數據模型
這是一種方式來處理隨時間的變化,而不必訴諸歷史表;它確實使你的查詢複雜化,所以你應該謹慎使用它。
。例如,而不是一個產品表如下
PRODUCTS
Product_ID primary key
Price
Description
AvailableFlag
在這種模式下,如果你想刪除一個產品,你執行"delete from product where product_id = ..."
;修改價格會"update products set price = 1 where product_id = ...."
隨着版本的模型,您有:
PRODUCTS
product_ID primary key
valid_from datetime
valid_until datetime
deleted_flag
Price
Description
AvailableFlag
在這種模式下,刪除一個產品需要你update products set valid_until = getdate() where product_id = xxx and valid_until is null
,然後插入新行的「deleted_flag =真」。
更改價格的工作方式相同。
這意味着您可以針對「髒」數據運行查詢並將其插入此表中,而不用擔心刪除意外錯過導入的項目。它還可以讓您隨時查看記錄的演變情況,並輕鬆回滾。
使用累積值
如果你有喜歡的東西「的產品庫存編號」一賬樣的機制,它有助於創造交易修改金額,而不是採取電流量您數據饋送。
。例如,而不是你的產品表中的列amount_in_stock
,有一個「product_stock_transaction」表:
product_stock_transactions
product_id FK transaction_date transaction_quantity transaction_source
1 1 Jan 2012 100 product_feed
1 2 Jan 2012 -3 stock_adjust_feed
1 3 Jan 2012 10 product_feed
在1月2日,在股票數量爲97;在1月3日,107
這樣的設計可以讓你保持跟蹤調整以及它們的來源,並且更易於移動多個來源的數據時管理。
這兩種方法都可以創造大量的數據 - 這取決於進口的數量和數據量 - 並可能導致複雜的查詢來獲取相對簡單的數據集。
很難規劃性能問題前面 - 我已經看到了這兩個「歷史」和「分類帳」工作,大量的數據。但是,正如Eugen在下面的評論中所說的,如果您遇到了一個過大的分類帳,可能需要通過彙總當前級別並刪除(或歸檔)舊記錄來清理分類賬表。
完全符合這一做法回滾問題上達成一致。 –
在某些記錄中,您是否有任何數據完整性問題? –
這取決於你的意思是「數據的完整性」的東西 - 腐敗行(例如劣棗,負數,...)都在做更新之前過濾掉/插入(在某些情況下,我們將拒絕整個導入)。如果你的意思是違反了一個約束,這經常發生。然後我們拒絕完全導入。 –