考虑使用继承来建模各种类型或艺术家:
(顺便说一句,你的Group_Member
桌子允许分组。我猜这不是你想要的。)
但是,这忽略了角色可能因艺术家类型而产生的任何差异。例如,让整个团队成为“指挥者”是没有意义的。如果强制执行这些类型的约束很重要,您可以采用“蛮力”方法并将特定于个人的角色与特定于组的角色分开:
(顺便说一句,如果您想防止特定于组的角色名称和特定于个人的角色名称重叠,则必须将两个角色表放在继承层次结构中。此处未显示。)
当然,这仍然不尊重某些角色的基数。例如,只有一个人(每场演出)可以成为“指挥”。为了解决这个问题,您必须进一步扩展模型:
并且可能必须为这些团体做类似的事情。
27
要通过这三种角色中的任何一种让所有参与给定表演的人(比如),您需要一个类似于以下的查询:
SELECT *
FROM Person
WHERE person_id IN (
SELECT person_id
FROM Group_Person JOIN Group_Performance_Role
ON Group_Person.group_id = Group_Performance_Role.group_id
WHERE performance_id = 27
UNION
SELECT person_id
FROM Person_Performance_MultiRole
WHERE performance_id = 27
UNION
SELECT person_id
FROM Person_Performance_SingleRole
WHERE performance_id = 27
)
请注意,这最多只列出一次人员,即使他们参与了多个角色的表演(例如,同一个人可以是“指挥”,并且是在同一表演中扮演角色的组的成员)。
要获取他们的角色名称,您可以:
SELECT Person.*, group_role_name
FROM Person
JOIN Group_Person
ON Person.person_id = Group_Person.person_id
JOIN Group_Performance_Role
ON Group_Person.group_id = Group_Performance_Role.group_id
WHERE performance_id = 27
UNION ALL
SELECT Person.*, person_multirole_name
FROM Person
JOIN Person_Performance_MultiRole
ON Person.person_id = Person_Performance_MultiRole.person_id
WHERE performance_id = 27
UNION ALL
SELECT Person.*, person_singlerole_name
FROM Person
JOIN Person_Performance_SingleRole
ON Person.person_id = Person_Performance_SingleRole.person_id
WHERE performance_id = 27
如您所见,我们不断使模型越来越精确,但也越来越复杂。而且我们甚至还没有进入歌曲和专辑,以及不断发展的团体成员(等等......)。我想你有责任决定“精确”和简单之间的正确平衡在哪里。