【问题标题】:How to model an Entity that can have 1-M of multiple entities?如何为可以具有 1-M 个多个实体的实体建模?
【发布时间】:2013-10-05 03:38:27
【问题描述】:

假设有一个实体“颁奖典礼”。在颁奖典礼上,一个“人”可以获得一个“奖”(或另一种说法:可以给一个人一个奖)。这很容易建模。

但是,一个“人”也可以被授予多个“奖励”。或者一个“奖”可以在多个“人”之间共享。这是我在建模方面苦苦挣扎的地方。我觉得我至少需要3张桌子:Award Ceremony、Person、Award。然后我想我需要一个映射表来正确建模 Person 实体可能有多个 Award,或者 Award 可能有多个 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 表。

【问题讨论】:

  • 同一奖项可以多次授予同一个人(可能在不同的仪式上)?
  • 映射表中的id不是必须的。这张桌子的PK是award_ceremony_id、person_id和award_id。这种组合总是独一无二的。例如。 2013 年诺贝尔物理学奖,彼得·希格斯和 2013 年诺贝尔物理学奖,弗朗西奥斯·恩格勒特。不需要引入额外的关键字段。

标签: mysql database database-design data-modeling eloquent


【解决方案1】:

你在正确的轨道上。您只需要AwardPerson 之间的交集表(多对多),如下所示:

Recipient 表允许多人共享奖励。它还允许一个人赢得多个奖项。当然,它也允许一个人获奖。

注意Recipient 不需要自己的idRecipient 的主键是AwardPerson 的外键组合。此外,没有理由为 Award_Ceremony 提供外键,因为与 Award 的关系已经暗示了这种关系。

编辑:表格和列...

您可以像这样使用表/列定义:

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)

【讨论】:

  • 我的模型失败了吗?不是标准化了吗?
  • @StackOverflowNewbie - 您的模型的潜在问题是它具有插入和删除异常。本质上,它没有通过第四范式的测试。这样想:你的模特做了什么来阻止有人录制乔治·RR·马丁在奥斯卡颁奖典礼上获得最佳新说唱专辑?此外,您的模型如何代表艾美奖在宣布任何获奖者之前获得了“杰出综艺系列”奖?特定奖项与特定仪式相伴的事实在语义上与获奖者无关。
  • 如果将award_ceremony_id (FK) 放在person 表中,您的模型是否同样可以正常工作?
  • 将award_ceremony_id (FK) 放在person 表中需要每个人在person 表中输入多个条目,因为他们参加了不止一个仪式。如果您想代表出勤率,更好的解决方案是在那里也有一个中间表。
  • StackOverflowNewbie 的设计表明,一个奖项可以在一个 Ceremonys 中多次分配给一个 persion(Award 实体独立于 Ceremony)。 @JoelBrown 的设计表明,一个奖项只能在一次仪式中分配给一个人。
【解决方案2】:

一个人可以有一个或多个奖励

人有奖||一对多关系

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

award
- id (PK)
- name

//颁奖典礼可以有很多人

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

【讨论】:

    【解决方案3】:

    我添加了解决方案,您的架构未完全规范化。我也喜欢添加收件人实体的想法之一,但要进行修改。检查以下两项。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多