2013-09-29 36 views
0

說有一個實體「頒獎典禮」。在頒獎儀式上,一個「人」可以獲得一個「獎」(或另一種說法:獎勵可以授予某人)。這很容易建模。如何建模一個可以有1-M個實體的實體?

但是,「Person」也可以被賦予多個「獎」。或者「獎」可以在多個「人」之間共享。這正是我在建模過程中掙扎的地方。我覺得我至少需要3張桌子:頒獎典禮,人物,獎項。然後我認爲我需要一個映射表來正確地模擬Person實體可能擁有多個獎項,或者獎勵可能擁有多個Person。

關於如何建模的建議?

我正在使用MySQL。還使用Laravel的Eloquent ORM。

編輯1:

我覺得這是它如何建模:

award_ceremony 
- id 
- name 

person 
- id 
- name 

award 
- id 
- name 

mapping 
- id 
- award_ceremony_id 
- person_id 
- award_id 

這是mapping表我不知道的。

+0

可以同一獎項被授予同一人多次(可能在不同的儀式)? –

+0

映射表中的id不是必需的。這個表的PK是award_ceremony_id,person_id和award_id。這種組合總是獨一無二的。例如。 2013年諾貝爾物理學獎得主彼得希格斯和2013年諾貝爾物理學獎得主弗朗西奧斯恩格勒特。介紹和額外的關鍵字段是沒有必要的。 –

回答

4

你在正確的軌道上。所有你需要的是AwardPerson像這樣的交叉表(很多到很多)表:

enter image description here

Recipient表允許多人共享一個獎項。它也允許一個人贏得多個獎項。當然,它也可以讓一個人贏得獎項。

注意Recipient並不需要自己idRecipient主鍵是外鍵的組合AwardPerson。另外,沒有理由擁有Award_Ceremony的外鍵,因爲與Award的關係已經暗示了這種關係。

編輯:表01​​列...

你可以使用表/列的定義,像這樣:

award_ceremony 
- id (PK) 
- name 

person 
- id (PK) 
- name 

award 
- id (PK) 
- name 
- award_ceremony_id (FK) // This belongs here! 

recipient 
- person_id (PK, FK) 
- award_id (PK, FK) 
+0

雖然我的模型失敗了嗎?它沒有正常化嗎? – StackOverflowNewbie

+0

@StackOverflowNewbie - 您的模型潛在的問題是它插入和刪除異常。本質上,它沒有通過第四範式的測試。您可以這樣想:您的模型如何防止某人錄製喬治RR馬丁獲得奧斯卡最佳新的說唱專輯?另外,您的模型如何表示在任何獲獎者被宣佈之前,艾美獎已獲得「傑出系列」獎?某個特定獎項與特定儀式一起進行的事實在語義上與獲獎的人無關。 –

+0

如果把'award_ceremony_id(FK)'放在'person'表中,你的模型能否同樣工作? – StackOverflowNewbie

0

一個人可以有1個或多個獎項

人有獎勵(s)|| 1對多的關係

person 
- id (PK) 
-award_id(PK,FK) 
- name 

award 
- id (PK) 
- name 

//頒獎典禮上可以有很多人

award_ceremony 
-id (PK) 
-person_id(FK) 
-name 
0

我加入瞭解決方案,你將有模式沒有完全恢復正常。我喜歡添加收件人實體的一個想法,但是需要修改。請檢查以下兩項。

解決方法:1

Ceremony 
     -ID 
     -NAME 
    PK = (ID) 
    Unique= (Name) 

    Person 
     -ID 
     -NAME 
    PK = (ID) 
    Unique= (Name) 

    Award 
     -ID 
     -NAME 
    PK = (ID) 
    Unique= (Name) 


    AwardOwner 
     -AwardOwnerID 
     -AwardID  =fk TO Award.ID 
     -OwnerID  =fk TO Person.ID 
     -CeremonyID  =fk TO Ceremony.ID 
    PK = (AwardOwnerID) 
    Unique = (AwardID+OwnerID+CeremonyID) 

解決方案:2

Ceremony 
     -ID 
     -NAME 
    PK = (ID) 
    Unique= (Name) 

    Person 
     -ID 
     -NAME 
    PK = (ID) 
    Unique= (Name) 

    Award 
     -ID 
     -NAME 
    PK = (ID) 
    Unique= (Name) 

    AwardCeremony 
     -AwardCeremonyID 
     -AwardID =fk TO Award.ID 
     -CeremonyID =fk TO Ceremony.ID 
     PK = (AwardCeremonyID) 
     Unique = (AwardID+CeremonyID) 


    AwardCeremonyRecipient 
     -AwardCeremonyID =fk TO AwardCeremony.AwardCeremonyID 
     -Recipient ID  =fk TO Person.ID 
     PK = (AwardCeremonyID+Recipient ID) 
相關問題