2012-09-20 41 views
2

我建立顯示從上世紀50年代和60年代的圖表記錄/相冊一個Web應用程序。建模音樂歌手/組合

目前,我有這樣的事情(很多不相關的東西刪除):

group_performance_role

「第一組」表曾一度建模爲一個「人」表中,「person_group」加入表一個「組」表。這樣做的問題是,我不能讓外鍵「group_performance_role.group_id」引用「person」和「group」表。

我決定保持這種結構,而是要求每一個「人」自動成爲1「集團」;然而,這將創建一個命名歧義意味着表擁有超過一兩件事 - 有時一個藝術家(「約翰·列儂」),有時一組(「披頭士」)。

我需要找到一種方法將藝術家(可能是一個人或一羣人)與表演聯繫起來,同時避免諸如擁有多種「類型」的表格之類的不良做法。

搜索了網頁,但發現相關答案的方式很少。任何幫助/建議/建議非常感謝!

編輯:「角色」表是人/組可以在表演中執行角色的查找表。例如:「藝術家」,「作曲」,「樂團指揮」等等等等

+1

什麼是「角色」? – podiluska

+0

對不起 - 我曾描述過它,但在發佈最終問題之前必須刪除它。請參閱編輯:) –

回答

2

考慮使用inheritance到各種或藝術家型號:

(順便說一句,你Group_Member表允許團體合組I」。猜這不是你想要的。)

enter image description here

然而,這忽略的角色可能取決於藝術家類型的任何差異。例如,整個團隊成爲「指揮家」是毫無意義的。如果執行這些類型的約束是非常重要的,你可以採取「強力」的方法,簡單地分開的人,具體由特定組的角色:

enter image description here

(順便說一句,如果你想防止重疊在特定於組和特定角色的名稱之間,您必須將兩個角色表放在繼承層次結構中,在此處未顯示。)

當然,這仍然不符合某些角色的基數。例如,只有一個人(每演出)可以成爲「指揮」。爲了解決這個問題,你就必須進一步擴展模型:

enter image description here

,可能類似的事情將會對各小組進行。

要通過任何這三種角色的獲得所有參與給定的性能(比如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 

正如你可以看到,我們不斷的模型越來越精細,也越來越複雜。而我們甚至還沒有進入歌曲和專輯,以及不斷髮展的小組成員(等等)。我想你有責任決定「精確」和簡單之間的正確平衡。

+0

你是對的 - 我不想要「團體在一起」......但是這個模型對於我正在構建的東西有點太複雜。值得慶幸的是,我正在使用的大部分數據已經存在 - 從20世紀30年代到最近的一切。 我是第二年BIT的學生,我只做了1個「數據庫」論文。我不知道在定義數據庫表時你可能有繼承或抽象 - 這不像我將要實例化它們,對吧?或者我誤解了? –

+0

@AlexMcMillan在概念上,可以將表視爲該類的「類」和行作爲該類的「對象」或「實例」。所以表之間的繼承是非常有意義的。不幸的是,關係DBMS不直接支持繼承 - 你必須調用它(正如我的鏈接中所解釋的)。 OTOH,ER符號確實承認遺傳。 –

+0

首先,我感謝你剛剛完成的所有工作來描述這一點 - 謝謝:) 其次,你能否給我一個SQL的例子,它可以讓所有在performance 27中扮演任何角色的人與他們執行的角色? –

1

我覺得你的方式很可能是有道理的。我假設你正在爲組和團隊成員/人員分別建模,因爲你想針對組和團隊成員執行不同的操作/操作(如果沒有的話,爲什麼還要模擬組成員)。

如果是這樣的話,那麼我想在約翰·列儂的情況下,你希望能夠對他執行這兩個人作戰集團化經營,所以有他在DB出現兩次,作爲一個集團和一個集體成員是有道理的,因爲這兩個實體代表約翰列儂在你的域中扮演的不同角色。

0
  • 一條記錄的許多歌曲。
  • 每首歌都有一個單一的藝術家 - 其中有一個名字。
  • 一個藝術家有一個或多個版本
  • 的ArtistVersion有一個或多個成員誰是表演

Records : 
    1 Give Peace a Chance 
    2 Penny Lane 

Artists 
    3 The Beatles 
    4 Plastic Ono Band 

Songs 
    5 4 Give Peace a Chance 
    6 3 Penny Lane 
    7 3 Strawberry Fields Forever 

RecordSongs 
    1 - 5 
    2 - 6 
    2 - 7 

ArtistVersions 
    8 - The Beatles v1 
    9 - Plastic Ono Band v1 

Performers 
    10 - Ringo Starr 
    11 - John Lennon 
    12 - Yoko Ono 

ArtistVersionMembers 
    8 - 10 
    8 - 11 
    9 - 11 
    9 - 12 
+0

對不起,我不明白 - 演出者有什麼不同的「版本」?有沒有「披頭士2.0」? –

+0

不是在披頭士樂隊中,不是,但是陣容變化的藝術家呢,例如:Sugababes,Genesis等。 – podiluska

+0

哦 - 所有的「差異」都被認爲是小組成員。因此,例如,如果Ringo Starr離開披頭士樂隊並由Joe Smith取代,我的規格要求所有5個名字都以小組成員的身份出現。 –

2

你的最終目標是要存儲的表演權的數據庫?

所以表演是由表演者的一些表演藝術家完成的,由一些作曲家的作品安排,由某些製片人等製作。我認爲你需要一個抽象的實體來表達所有這些可能性。我現在可以召喚的最好名詞是Credit,因爲你會「延長你的名字的信用。「(Morisette 1995

所以,我想它的方式,你將有幾類信用的,在第一級我想這是集團這是一套 S和組織這將財產以後像「Parlephone」或「Island唱片」等

有可能是子類,這些信用類的,這取決於你希望存儲attibutes,但我想每個性能將有一批PerformanceCredit關係和各PerformanceCredit關係將有一個foriegn關鍵PerformanceCreditType


這一切都忽略了與我認爲這是從性能邏輯上獨立的將​​有自己的SongCredit關係的任何關係,該SongCreditType「作家」是明顯的一個想到這一點。每個正相關的一些性能小號

這一切都很好地延伸出記錄(DVD,78,LP,MP3等),這將是性能 ES的集合,但可以並且確實擁有他們自己的獨立Credit


我認爲這是有道理的,因爲我認爲你會從學分中得到這些信息。

我認爲你需要這種靈活性。想想如果我想報告與"Paul McCartney"有關的所有事情,作爲作家,作曲家,音樂家和製作人的他的直接信用,無論是單獨或組合,都是巨大的。然後考慮的,他也受到了其他musiacians等書面和組成的歌曲表演

+0

我喜歡這個答案,但我不確定我是否正確地遵守它:)基本上你說要用「PerformanceCreditType」表替換「角色」表並添加某種「信用」表來代替「 group_performance_role「表? –

+0

實質上是的,所以信用表將持有PK的信用和所有信用共享的任何屬性(我不能立即想到一個。) – Jodrell

+0

說實話,我不明白這將不同於我有... –