Mysql

規範化的 MYSQL 數據庫比用逗號字元串組織的數據庫更快嗎?

  • July 8, 2015

我一直使用帶有逗號分隔 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 不同,後者雖然對臨時利基數據分析很有用,但沒有堅實的理論基礎。

請努力並花時間建立一個好的框架來分析/查詢您的數據——您最終只會遇到很多麻煩(性能不佳、重新設計、複雜查詢)。

引用自:https://dba.stackexchange.com/questions/106375