考慮使用inheritance到各種或藝術家型號:
(順便說一句,你Group_Member
表允許團體合組I」。猜這不是你想要的。)
![enter image description here](https://i.stack.imgur.com/McGt3.png)
然而,這忽略的角色可能取決於藝術家類型的任何差異。例如,整個團隊成爲「指揮家」是毫無意義的。如果執行這些類型的約束是非常重要的,你可以採取「強力」的方法,簡單地分開的人,具體由特定組的角色:
![enter image description here](https://i.stack.imgur.com/NJM1k.png)
(順便說一句,如果你想防止重疊在特定於組和特定角色的名稱之間,您必須將兩個角色表放在繼承層次結構中,在此處未顯示。)
當然,這仍然不符合某些角色的基數。例如,只有一個人(每演出)可以成爲「指揮」。爲了解決這個問題,你就必須進一步擴展模型:
![enter image description here](https://i.stack.imgur.com/sLqqz.png)
,可能類似的事情將會對各小組進行。
要通過任何這三種角色的獲得所有參與給定的性能(比如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
正如你可以看到,我們不斷的模型越來越精細,也越來越複雜。而我們甚至還沒有進入歌曲和專輯,以及不斷髮展的小組成員(等等)。我想你有責任決定「精確」和簡單之間的正確平衡。
什麼是「角色」? – podiluska
對不起 - 我曾描述過它,但在發佈最終問題之前必須刪除它。請參閱編輯:) –