【问题标题】:Do I need a diamond relationship to make this problem work?我需要钻石关系来解决这个问题吗?
【发布时间】:2021-07-04 03:02:54
【问题描述】:

我已经在互联网上搜寻了这个问题的答案 - 我应该以我是一个完全的业余爱好者来开始这个问题。

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

所以,问题是这样的:


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

我有一张音乐家角色表(musiciansID、rolesID)。音乐家可以演奏多种乐器。

我有一张特定频段 (bandID)(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:

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

乐队角色:

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

乐队中的音乐家:

5 件,人声,莎拉·新秀丽
5 件,键盘,NULL
5 件,吉他,NULL
5 件,鼓,山姆钟乳石
5 件,贝斯,NULL

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


非常感谢您的宝贵时间!

【问题讨论】:

  • 许多乐队的成员数量往往是动态的,并且一直在变化。我会重新考虑是否真的需要特定的乐队表(bandID)(8 件,6 件)。
  • 样本数据和期望的结果会很有帮助。
  • 能否添加您在项目中使用的数据库类型标签
  • @jarlh 谢谢!我已经进行了编辑。它适用于特定格式的表演乐队,因此他们将始终拥有相同的乐器阵容(但不同的音乐家)
  • 我认为不可能在数据库级别上限制它。该应用程序必须验证这样的关系。 Db 关系商店约束非常简单。

标签: mysql database-design


【解决方案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

【讨论】:

  • 嗨,Damir,非常感谢您的回答 - 真的很有趣。其中一个限制是不同的(我的错没有解释!):可能存在同一乐队的许多迭代(即同一晚上的不同预订/音乐家生病等)第二个限制是正确的。也许我可以: Booking BKI 存在 PK {BKI} band BND 属于 booking BKI band_booking {BND, BKI} PK {BND, BKI} FK1 {BND} REFERENCES band {BND} FK2 {BKI} REFERENCES booking {BKI} 然后MUS_BKI_BND_ROL 与 FK 重叠?人物用完了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多