Mysql
規範化的 MYSQL 數據庫比用逗號字元串組織的數據庫更快嗎?
我一直使用帶有逗號分隔 id 字元串的數據庫,比如
+------+--------------+ | 編號 | 使用者 | +------+--------------+ |1 |2,4,5,6,12 | +------+--------------+ |2 |1,3,7,9 | +------+--------------+
然後我用來分解字元串users並蒐索另一個表中的每個數字。
我一直認為它很不安全,但我最近聽說過規範化,我想上面的表格應該是這樣的(如果我錯了,請糾正我)
+----+-----+ | id |使用者| +----+-----+ |1 |2 | +----+-----+ |1 |4 | +----+-----+ |1 |5 | +----+-----+ |1 |6 | +----+-----+ |1 |8 | +----+-----+ |1 |12 | +----+-----+ |2 |1 | +----+-----+ |2 |3 | +----+-----+ |2 |7 | +----+-----+ |2 |9 | +----+-----+
我的問題是,第二個更快嗎?而且,為什麼?
如果我不夠清楚,我可以準確地解釋我的疑問。
SQL在操作/分析和從逗號類型模式中提取資訊方面非常差。
該架構也違反了 Codd 的規則
規則 2:保證訪問規則:
所有數據都必須是可訪問的。該規則本質上是對主鍵基本要求的重述。它表示數據庫中的每個單獨的標量值都必須通過指定包含表的名稱、包含列的名稱和包含行的主鍵值來進行邏輯定址。
在這種情況下,您將如何訪問數據 id = 1, users = 5?
您當然需要一個額外的欄位來確保每條記錄的唯一性,但這將在未來得到回報。我只是順便說一句,欄位名稱“id”或多或少按照慣例用於 MySQL 中的 PRIMARY KEY——但這不是一項義務。
此外,請查看 The Register 中的這篇文章,了解 Codd 努力對數據建模和儲存施加某種紀律的一些基本原理。
你越堅持 Codd 的規則和聲音設計原則越好。關係代數是唯一具有良好數學基礎的框架。這與您的 Hadoop 和 MongoDB 不同,後者雖然對臨時利基數據分析很有用,但沒有堅實的理論基礎。
請努力並花時間建立一個好的框架來分析/查詢您的數據——您最終只會遇到很多麻煩(性能不佳、重新設計、複雜查詢)。