Sql-Server

如何在表中實現取消屬性?

  • December 30, 2015

這是在數據庫表中實現取消屬性的最佳方式,前提是只有不到 3% 的行被取消。

對於取消的數據,我想儲存附加資訊

  • 通過誰
  • 什麼時候
  • 為什麼

在大約 95% 的查詢中,我只想選擇未取消的行。

此外,我希望能夠對未取消的列的某些列實施唯一約束。

在某些列中使用 NULL 作為未取消的指示符有什麼優缺點?

您有 97% 的活動行和這 97% 的 95% 的查詢。

選擇 97% 行的 WHERE 子句不會通過索引得到幫助:它的選擇性不夠

我會為您的“事物”考慮 2 個表:ThingActive 和 ThingCancelled

對於查詢已取消行的 5%,您只能讀取 Canceled 表或 UNION/View

對此有一個轉折…

取消的表僅儲存主表 ID 和額外的列(因此不存在查找活動的)。

我不確定我是否喜歡NULL被取消。我想我寧願有一個預設為 1 的 Active 標誌,並在取消某些內容時設置為 0。現在您的檢查只是 WHERE active = 1 或 WHERE active = 0,而不是處理所有的OR IS NULLOR IS NOT NULL檢查,並且如果該模型成熟為其他原因,則行可能由於“取消”以外的其他原因而處於非活動狀態。如果您使用的是 SQL Server 2008+,則可以使用篩選索引使一種或另一種類型的查詢更有效。NULL意味著未知,並且在您只有兩種狀態的情況下,“未取消”不是未知的。

至於誰,為什麼,什麼時候?也許這完全是一個單獨的表,並且可以像審計日誌一樣起作用(包括實體是否被標記為已取消,然後再次啟動,然後再次取消等)。它只是這樣的:

CREATE TABLE dbo.<something>AuditLog
(
   key INT NOT NULL FOREIGN KEY REFERENCES dbo.<something>(key),
   action NVARCHAR(32) NOT NULL, 
     -- perhaps a CHECK here or a foreign key to an 
     -- action code table, e.g. 'made active, made inactive'
   who NVARCHAR(64) NOT NULL,
   when DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
   why NVARCHAR(MAX)
);

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