Mysql

我應該如何為我的數據庫建模 - 無法決定多個選項

  • January 25, 2021

如果這可能是一個相當初級的問題,我深表歉意。對於我的數據庫設計,我已經制定了多個選項,但無法決定應該實施哪一個。我正在使用10.4.17-MariaDB.

基本思想:

我有一個名為的表Article,我想在其中儲存簡單的欄位,例如name(例如 varchar)、description(例如 varchar)、…等。還有更複雜的資訊,例如ProducerPrice等等。

我已經制定了以下內容:

實施 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:1m: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

AFOREIGN KEY做了兩件事:它提供了一個檢查數據完整性的約束,並確保有一個合適的INDEX(用於性能)。(外鍵是可取的,但不是必需的。)

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