Database-Design

多個多對多關係

  • August 30, 2017

我從來沒有遇到過類似的情況,所以我希望收集一些關於如何實現這一點的提示。情況如下:

我正在創建一個應用程序來跟踪和管理樂譜及其隨附資訊。書籍可以有很多歌曲(多對多)。我被絆倒的地方是我們開始追踪藝術家的時候。書籍可以有多個藝術家,但歌曲也可以有不同的藝術家。

例如,Garth Brooks 合輯(Garth 是這本書的藝術家)有一首歌是與 Trisha Yearwood 的二重唱。Trisha Yearwood 不是整本書的合作藝術家,但可以是該書中多首歌曲的合作藝術家。我想將書籍與藝術家以及歌曲與藝術家聯繫起來,這樣我就可以搜尋並找到所有 Garth Brooks 曾擔任藝術家的書籍和歌曲。

-------
|Books|
-------
|id   |
|name |
-------

-------
|Songs|
-------
|id   |
|name |
-------

//Join Table for Books and Songs
--------------
|Book_songs  |
--------------
|id          |
|books_id FK |
|songs_id FK |
--------------

---------
|Artists|
---------
|id     |
|name   |
---------

這會像 和 的單獨連接表一樣簡單BooksSongs?:

----------------
|Book_artists  |
----------------
|id            |
|books_id   FK |
|artists_id FK |
----------------

----------------
|Song_artists  |
----------------
|id            |
|songs_id   FK |
|artists_id FK |
----------------

還是有更好的方法來設計這些關係?

提前感謝您的幫助!

我認為您的解決方案(兩個連接表)是有效的。但是,我懷疑您正在跟踪兩個不同的事物,並且想確保您在設計方面對此很清楚。

在數據庫級別,與一本書關聯的藝術家不一定與與歌曲關聯的藝術家有任何關係。從邏輯上講,與一本書相關的藝術家(幾乎)肯定也會與書中的每一首歌相關聯;但是,就藝術家與歌曲或藝術家與書籍之間的關係而言,這無關緊要。

有些事情不要做(不是你一定要做其中的任何一個,而是為了其他人在未來看到這個):

  • 不要使用與歌曲關聯的藝術家來定義圖書的藝術家。我假設“藝術家”=“表演者”,但假設它也包括歌曲的作者。一本 Elton John 歌曲的書可能會表明,每首歌不僅有 Elton John 的表演,還有 Bernie Taupin 的寫作;但是,預設情況下這不一定相關。您需要藝術家直接與圖書相關聯。
  • 不要忽視圖書藝術家與每首歌曲之間的關聯。這是不言而喻的,一旦一首歌被包含在兩本不同的書中,基於兩個不同的藝術家,但在早期,人們可能會認為在書籍級別定義藝術家,可以在 dong 級別添加額外的藝術家並讓書級協會涵蓋與所有歌曲相關聯的藝術家。同樣,如果布魯克斯/耶伍德二重唱進入布魯克斯的書和耶伍德的書,這將成為問題。你需要在書籍和歌曲這兩個層面上的關聯。

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