database - normalization中文 - sql normalization w3schools




在數據庫列中存儲分隔列表真的很糟糕嗎? (6)

想像一下帶有一組複選框的網頁表單(可以選擇任何一個或全部)。 我選擇將它們保存在存儲在數據庫表的一列中的以逗號分隔的值列表中。

現在,我知道正確的解決方案是創建第二個表並正確地規範數據庫。 實施簡單解決方案的速度更快,我希望能夠快速獲得該應用程序的概念驗證,而不必花費太多時間。

我認為節省的時間和簡單的代碼在我的情況下是值得的,這是一個可靠的設計選擇,還是應該從一開始就將其規範化?

更多的上下文,這是一個小型的內部應用程序,它基本上替代了存儲在共享文件夾中的Excel文件。 我也在問,因為我正在考慮清理該程序並使其更易於維護。 有些事情我並不完全滿意,其中一個是這個問題的主題。


“其中一個原因是懶惰”。

這響起警鐘。 你應該這樣做的唯一原因是你知道如何做到“正確的方式”,但你得出的結論是有一個切實的理由不這樣做。

說了這麼一句話:如果您選擇以這種方式存儲的數據是您永遠不需要查詢的數據,那麼可能存在以您選擇的方式存儲它的情況。

(有些用戶會對我上一段的陳述提出異議,說“你永遠不知道將來會增加什麼要求”,這些用戶要么被誤導了,要么表達宗教信仰,有時候根據你的要求工作是有好處的。在你面前。)


SO提出了許多問題:

  • 如何從逗號分隔列表中獲得特定值的計數
  • 如何從該逗號分隔列表中獲得只具有相同2/3 /等特定值的記錄

逗號分隔列表的另一個問題是確保值一致 - 存儲文本意味著錯別字的可能性...

這些都是非規格化數據的所有症狀,並強調為什麼您應該始終為歸一化數據建模。 非規範化可以是查詢優化, 在需求實際出現時應用


我可能會採取中間立場:將CSV中的每個字段都放到數據庫的一個單獨的列中,但不用擔心標準化(至少現在)。 在某種程度上,規範化可能會變得有趣,但是將所有數據推入單個列中,根本不會從使用數據庫中獲益。 您需要將數據分離為邏輯字段/列/您想調用它們的任何內容,然後才能對其進行有意義的處理。


我需要一個多值列,它可以作為一個xml字段來實現

它可以根據需要轉換為逗號分隔

使用Xquery查詢sql server中的XML列表

作為一個xml字段,可以解決一些問題。

使用CSV:無法確保每個值都是正確的數據類型:無法防止1,2,3,banana,5

使用XML:標籤中的值可以被強制為正確的類型

使用CSV:不能使用外鍵約束將值鏈接到查找表; 沒有辦法強制參照完整性。

使用XML:仍然是一個問題

使用CSV:無法強制執行唯一性:無法阻止1,2,3,3,5

使用XML:仍然是一個問題

使用CSV:無法從列表中刪除值而無需獲取整個列表。

使用XML:可以刪除單個項目

使用CSV:很難搜索列表中給定值的所有實體; 您必須使用低效的表掃描。

使用XML: xml字段可以被索引

使用CSV:難以統計列表中的元素,或執行其他聚合查詢。**

使用XML:並不特別困難

使用CSV:很難將這些值加入到它們引用的查找表中。**

使用XML:並不特別困難

使用CSV:難以按排序順序獲取列表。

使用XML:並不特別困難

使用CSV:將整數存儲為字符串所需的空間大約是存儲二進制整數的兩倍。

使用XML:存儲比csv更糟糕

使用CSV:加上很多逗號字符。

使用XML:使用標記而不是逗號

簡而言之,使用XML解決了分隔列表中的一些問題,並且可以根據需要將其轉換為分隔列表


是的,這不好的。 我的觀點是,如果你不喜歡使用關係數據庫,然後尋找一個更適合你的替代方案,那麼有很多有趣的“NOSQL”項目還有一些非常先進的功能。


那麼我已經在SQL Server的NTEXT列中使用鍵/值對選項卡分隔列表4年多了,並且它可以工作。 你確實失去了製作查詢的靈活性,但另一方面,如果你有一個圖書館堅持/馴獸師的關鍵價值對,那麼這不是一個壞主意。







database-normalization