Mysql

支付特徵系統的數據庫設計

  • April 15, 2018

我正在建構一個系統,訪問者可以從我的網站購買模組。目前我只有 3 個可用,但當然這個數字會繼續增長。

為了在我的 MySQL 數據庫中促進這一點,我懷疑這兩種架構之一,主要是關於性能和可伸縮性。

我的解決方案中有一個使用者表,其中包含使用者 ID、電子郵件、密碼和其他欄位。

方法一:一個名為“user_modules”的表,其中一列代表每個模組,布爾值(1 或 0)對應於它們是否具有模組。

+---------+----------+----------+----------+
| user_id | module_1 | Module_2 | Module_3 |
+---------+----------+----------+----------+
|       1 |        1 |        0 |        1 |
|       2 |        1 |        1 |        0 |
|       3 |        1 |        1 |        1 |
+---------+----------+----------+----------+

方法二:兩張表:一個模組表,所有不同的模組都在

+-----------+-------------+--------------------+-------+
| module_id | module_name | module_description | price |
+-----------+-------------+--------------------+-------+
|         1 | test        | test2              |     5 |
|         2 | demo        | demo               |    10 |
+-----------+-------------+--------------------+-------+

user_modules 表,其中每一行都是一個 user_id 加上一個 module_id。

+---------+-----------+
| user_id | module_id |
+---------+-----------+
|       1 |         1 |
|       1 |         2 |
|       2 |         3 |
|       2 |         1 |
|       2 |         5 |
|       3 |         1 |
+---------+-----------+

現在我把所有的東西都輸入了,我很清楚方法二是更好的選擇。但是,這裡還有其他建議或其他可能的改進嗎?

第二種方法符合第三範式(3NF),這始終是比非規範化 (0NF) 更好的起點,例如您的第一個選項。

將重複的列轉換為另一個表中的行是完全可擴展的,並且有助於保持原始碼更穩定,因為在創建新模組時不會將列添加到(選項 1)表中。

此外,第二個選項更強大,因為它可以讓您輕鬆添加有關特定使用者購買模組的其他資訊。例如,您可以添加purchase_date到您的使用者/模組表。您也可以將其添加actual_purchase_price到同一張表中。這將允許您跟踪諸如對模組收取的價格的變化,或者您是否以促銷價格將特定模組出售給特定使用者。

我會選擇第二種方法。這樣,您以後可以更輕鬆地添加更多模組,因為您只需在模組表中添加一個新條目。然而,如果您使用第一種方法並且想要添加新模組,則必須創建一個新表。

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