Sql-Server

我應該如何儲存對數據庫中項目的更改?

  • April 3, 2015

我有itemid分配給它們的屬性的項目(用 跟踪)(field1例如field1)。在任何給定時間,field1=val1, field2=val1, …,fieldn=valn其中val1, val1,…, valn= 1..100。和n= 1..20

我需要設計一個數據庫來跟踪每個欄位的更改,我不確定是否應該將每個欄位列為一列(例如table1),還是將每個更改列為一行(例如table2)。

create table1 (datetimeofchange datetime2, itemid bigint, field1 smallint, field2 smallint, field3 smallint, field4 smallint, ..., fieldn smallint)

create table2 (datetimeofchange datetime2, itemid bigint, fieldval smallint, changeval smallint)

create table2lookup (fieldval smallint, fieldname varchar(50))

在這兩種設計之間進行選擇時,我得到了哪些取捨?是否有另一種設計會有不同的權衡?有一些我可以用Google搜尋的術語來研究這個問題嗎?

謝謝。

我不是專家,但我看到了一些潛在的利弊。

因此,如果您使用 table1,並在每次數據更改後列出每一行,會發生什麼?好吧,如果您有很多小的更新,例如一次只更改一個欄位,那麼您將有很多來自未更改欄位的冗餘數據。如果您只列出已更改的欄位並將其餘欄位保留為 NULL,則可能很難弄清楚您的數據是什麼樣的,但不是一個糟糕的解決方案。Table1 非常適合更改多列

另一方面,表 2 則相反。假設您為 1,000 行更新了 10 個欄位。然後在表 2 中,您得到 10,000 行。每個數據更改也以 10 行結束。如果您大部分時間只更新一個欄位,它將與 table1 相當。Table2 更適用於一次只影響一列或幾列的更新。

就個人而言,我會使用 table1 方法。它更簡單,更直接。如果您確實更新了多列,它只記錄一行。而且,如果您僅在欄位更改時進行記錄,那麼您就可以消除儲存冗餘數據,儘管您的腳本來確定數據更改的內容可能更複雜。另一方面,如果你只有幾十萬行,那麼儲存冗餘數據可能不是那麼糟糕,但如果你有一億行,那麼你可能會遇到一些問題。

希望這至少有一點幫助。

引用自:https://dba.stackexchange.com/questions/96989