Sql-Server
如何在表中實現取消屬性?
這是在數據庫表中實現取消屬性的最佳方式,前提是只有不到 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 NULL
或OR 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) );