在資料庫列中儲存分隔清單真的那麼糟嗎?
P粉020556231
P粉020556231 2023-08-27 19:52:49
0
2
421
<p>想像一個有一組複選框的 Web 表單(可以選擇其中任何一個或全部)。我選擇將它們保存在儲存在資料庫表的一列中的逗號分隔值清單中。 </p> <p>現在,我知道正確的解決方案是建立第二個表格並正確規範資料庫。實現簡單的解決方案速度更快,我希望快速獲得該應用程式的概念驗證,而不必在其上花費太多時間。 </p> <p>我認為在我的情況下節省的時間和更簡單的程式碼是值得的,這是一個合理的設計選擇,還是我應該從一開始就將其標準化? </p> <p>更多上下文,這是一個小型內部應用程序,本質上替換了儲存在共用資料夾中的 Excel 檔案。我問這個問題也是因為我正在考慮清理程式並使其更易於維護。其中有些事情我不太滿意,其中之一就是這個問題的主題。 </p>
P粉020556231
P粉020556231

全部回覆(2)
P粉948258958

「原因之一是懶惰」。

這敲響了警鐘。您應該做這樣的事情的唯一原因是您知道如何「以正確的方式」做這件事,但您得出的結論是有一個切實的理由不這樣做。

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

(有些用戶會對我上一段的說法提出異議,說「你永遠不知道將來會增加什麼要求」。這些用戶要么被誤導,要么陳述宗教信仰。有時,努力工作是有利的你面前的要求。)

P粉545956597

除了違反第一範式之外,還因為儲存在單一值中的重複群組值列、逗號分隔清單還有很多其他更實際的問題:

  • 無法確保每個值都是正確的資料型態:無法防止 1,2,3,banana,5
  • 不能使用外鍵約束將值連結到查找表;無法強制執行引用完整性。
  • 無法強制唯一性:無法阻止1,2,3,3,3,5
  • #如果不取得整個列表,則無法從列表中刪除值。
  • 儲存的清單長度不能超過字串列的長度。
  • 很難搜尋清單中具有給定值的所有實體;你必須使用低效率的表格掃描。可能不得不求助於正規表示式,例如在 MySQL 中:
    idlist REGEXP '[[:<:>:]]' 或在 MySQL 8.0 中:idlist REGEXP '\\b2\\b'李>
  • #很難對清單中的元素進行計數,或進行其他聚合查詢。
  • 很難將值連接到它們所引用的查找表。
  • 很難依照排序順序取得列表。
  • 很難選擇一個保證不會出現在值中的分隔符號

為了解決這些問題,您必須編寫大量應用程式程式碼,重新發明 RDBMS 已經提供的更有效率的功能。

逗號分隔的清單是錯誤的,我將其作為我書中的第一章:SQL 反模式,卷 1 :避免資料庫程式設計的陷阱

有時您需要採用非規範化,但正如 @OMG Ponies 所提到的,這些都是例外情況。任何非關係「最佳化」都會使一種類型的查詢受益,但會犧牲資料的其他用途,因此請確保您知道哪些查詢需要特別處理,以便它們值得非規範化。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!