我需要钻石关系才能解决这个问题吗?

时间:2021-04-08 09:01:18

标签: mysql database-design

我在互联网上搜索并试图找到答案 - 我应该以我是一个完全业余的人来回答这个问题。

编辑:数据库类型是 mySQL
编辑:带大小不是动态的;他们是为表演乐队准备的,即 5 首歌曲永远是 Vocals |吉他 |钥匙 |低音 |鼓
编辑:我在底部包含了一些示例数据

所以,问题是这样的:


我有一张音乐家表(musiciansID)
我有一个表角色(rolesID),​​这是他们在乐队中的角色(主唱、吉他等)

我有一个musicians_roles(musiciansID,rolesID)表。音乐家可以演奏多种乐器。

我有一张特定乐队(乐队 ID)(8 件、6 件)等的表格

我有一个band_roles(bandID,rolesID)表。
每个乐队都有特定的格式,例如3张|人声、吉他、鼓


我正用头撞墙,试图强制执行以下操作:

BandID = 1(例如 3 个)

BandID 的 RolesID = 1,2,3(人声、贝斯、鼓)

这就是我摔倒的地方

BandID 的 MusiciansID = 1,2,3(John、Paul、Ringo),但如果我尝试将 Ringo 作为贝斯手,我希望约束失败。


如果这太简单了,我很抱歉,我只是没有词汇来搜索它。我有一种感觉,答案可能与下面的链接类似,但我无法让它发挥作用。

https://dba.stackexchange.com/questions/34040/many-to-many-and-weak-entities

一些示例数据

音乐家:

乔·博格斯
莎拉新秀丽
山姆钟乳石
唐自行车
特蕾西·希尼

角色:

人声
小号
萨克斯
吉他
低音

键盘

Musicians_roles:

乔·布洛格斯,萨克斯
乔·博格斯,鼓
莎拉新秀丽,主唱
山姆钟乳石,鼓
骑自行车,吉他
特雷西·希尼,贝斯

Band_Roles:

5 首,人声
5 件,键盘
5 件,吉他
5 件,鼓
5 件,贝司
6 件,人声
6 件,键盘
6 件,吉他
6 件,鼓
6 件,贝司
6 件,萨克斯

乐队中的音乐家:

5 件,主唱,莎拉新秀丽
5 件,键盘,NULL
5 件,吉他,NULL
5 件,鼓,山姆钟乳石
5 件,低音,空

然后,比如说我试图让 Sarah Shiney 弹吉他,但它会失败。


非常感谢您的时间!

1 个答案:

答案 0 :(得分:1)

-- Role ROL exists.
--
role {ROL}
  PK {ROL}
-- Musician MUS exists.
--
musician {MUS}
      PK {MUS}
-- Musician MUS can play role ROL.
--
musician_role {MUS, ROL}
           PK {MUS, ROL}

FK1 {MUS} REFERENCES musician {MUS}
FK2 {ROL} REFERENCES role     {ROL}
-- Band BND exists.
--
band {BND}
  PK {BND}
-- Band BND has role ROL.
--
band_role {BND, ROL}
       PK {BND, ROL}

FK1 {BND} REFERENCES band {BND}
FK2 {ROL} REFERENCES role {ROL}

约束,正如我从示例中理解的那样:

  • 每位音乐家最多可以在一个乐队中演奏;每个乐队:该乐队中可以有不止一位音乐家演奏。

  • 对于每个乐队和角色:只有一位音乐家在该乐队中担任该角色。

-- Musician MUS plays in band BND in role ROL.
--
musician_band_role {MUS, BND, ROL}
                PK {MUS}
                AK {BND, ROL}

FK1 {MUS, ROL} REFERENCES musician_role {MUS, ROL}
FK2 {BND, ROL} REFERENCES band_role     {BND, ROL}

注意:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key   (Unique)
FK = Foreign Key