Mysql
我應該如何為我的數據庫建模 - 無法決定多個選項
如果這可能是一個相當初級的問題,我深表歉意。對於我的數據庫設計,我已經制定了多個選項,但無法決定應該實施哪一個。我正在使用
10.4.17-MariaDB
.基本思想:
我有一個名為的表
Article
,我想在其中儲存簡單的欄位,例如name
(例如 varchar)、description
(例如 varchar)、…等。還有更複雜的資訊,例如Producer
,Price
等等。我已經制定了以下內容:
實施 I(僅使用 FK)
表:項目 | id (auto_inkr.) | fk_producer | ... | | --------------- | ----------- | --- | | 1 | 1 | ... | | 2 | 1 | ... | | 3 | 2 | ... | | ... | ... | ... |
根據定義,
Producer(id: 1)
,是Producer of Articles (1, 2, ...?)
。實現二(使用查找表)
表:項目 | id (auto_inkr.) | fk_article_producer | ... | | ----------------- | ------------------- | --- | | 1 | 1 | ... | | 2 | 1 | ... | | 3 | 2 | ... | | ... | ... | ... |
表:文章製作者 | id (auto_inkr.) | 文章_fk | producer_fk | | ----------------- | ----------- | ----------- | | 1 | 1 | 1 | | 2 | 2 | 1 | | 3 | 3 | 2 | | ... | ... | ... |
在這種情況下,我已經實現了一個映射表。這也將允許我進行
many-to-many
配置。我不必以這種方式實現它——這取決於我的後端程式碼如何儲存數據。問題
請記住,
Article
到目前為止,我的表將具有類似的7+
依賴表(如此處的範例所示:例如Producer
)。我想設計它,這樣我就可以為text- respectively tag-based-search
以後編寫一個有效的過濾函式(查詢)。
- 我應該選擇哪種設計,為什麼?
- 這些方法(最佳實踐)的優點或缺點是什麼?
設計 2 需要兩個,當這裡每篇文章有多個生產者時,你需要在文章和生產者之間建立一個橋接表,所以一個生產者可以有多個文章,一個文章可以有多個生產者
您的第一個僅適用於 1 對 1 reöationships。
所以你有什麼1:1或m:n
Thet會決定你需要什麼
為每個“實體”製作一個表格,例如“文章”和“生產者”。每個這樣的表都會有一個
id
和各種屬性(名稱等)。然後描述這些實體對之間的“關係”並建立關係:
- 對於one:one,重新考慮為什麼有兩個單獨的表;考慮將表合併在一起。
- 對於one:many,“many”表需要一個帶有
id
“one”的列。並INDEX
在該列上有一個。- 對於many:many ,您需要一個只有兩列的額外表,即每個其他表的 id。
id
(注意:為這個專欄寫 一個新的是浪費。更多討論:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table)A
FOREIGN KEY
做了兩件事:它提供了一個檢查數據完整性的約束,並確保有一個合適的INDEX
(用於性能)。(外鍵是可取的,但不是必需的。)