在資料庫列中儲存分隔清單真的那麼糟嗎?
P粉020556231
2023-08-27 19:52:49
<p>想像一個有一組複選框的 Web 表單(可以選擇其中任何一個或全部)。我選擇將它們保存在儲存在資料庫表的一列中的逗號分隔值清單中。 </p>
<p>現在,我知道正確的解決方案是建立第二個表格並正確規範資料庫。實現簡單的解決方案速度更快,我希望快速獲得該應用程式的概念驗證,而不必在其上花費太多時間。 </p>
<p>我認為在我的情況下節省的時間和更簡單的程式碼是值得的,這是一個合理的設計選擇,還是我應該從一開始就將其標準化? </p>
<p>更多上下文,這是一個小型內部應用程序,本質上替換了儲存在共用資料夾中的 Excel 檔案。我問這個問題也是因為我正在考慮清理程式並使其更易於維護。其中有些事情我不太滿意,其中之一就是這個問題的主題。 </p>
「原因之一是懶惰」。
這敲響了警鐘。您應該做這樣的事情的唯一原因是您知道如何「以正確的方式」做這件事,但您得出的結論是有一個切實的理由不這樣做。
話雖如此:如果您選擇以這種方式存儲的數據是您永遠不需要查詢的數據,那麼可能存在以您選擇的方式存儲它的情況。
(有些用戶會對我上一段的說法提出異議,說「你永遠不知道將來會增加什麼要求」。這些用戶要么被誤導,要么陳述宗教信仰。有時,努力工作是有利的你面前的要求。)
除了違反第一範式之外,還因為儲存在單一值中的重複群組值列、逗號分隔清單還有很多其他更實際的問題:
idlist REGEXP '[[:<:>:]]'
或在 MySQL 8.0 中:idlist REGEXP '\\b2\\b'
李>為了解決這些問題,您必須編寫大量應用程式程式碼,重新發明 RDBMS 已經提供的更有效率的功能。
逗號分隔的清單是錯誤的,我將其作為我書中的第一章:SQL 反模式,卷 1 :避免資料庫程式設計的陷阱。
有時您需要採用非規範化,但正如 @OMG Ponies 所提到的,這些都是例外情況。任何非關係「最佳化」都會使一種類型的查詢受益,但會犧牲資料的其他用途,因此請確保您知道哪些查詢需要特別處理,以便它們值得非規範化。