【问题标题】:What things I should consider when having table relationships [closed]有表关系时我应该考虑什么[关闭]
【发布时间】:2022-01-24 01:42:09
【问题描述】:

假设我们有一个场景,用户可以通过上传图片来参与比赛,那么创建具有以下表格 USERS、COMPETITIONS、PARTICIPATED_COMPETITIONS 和 PICTURES 以及以下关系的表格关系会是一种更好的方法

USERS - PARTICIPATED_COMPETITIONS 是一对多关系

PARTICIPATED_COMPETITIONS - COMPETITIONS 1to1 关系

有了这些信息,我想知道在创建与 PICTURES 表的关系时,下面列出的选项在灵活性性能方面是否各有优劣。您会考虑使用哪个?为什么?

1- 我可以将用户表和竞争表的主键作为外键保存在 PICTURES 表中

2- 我可以在 PICTURES 表中只保留 PARTICIATED_COMPETITIONS 主键作为外键。 PARTICIATED_COMPETITIONS 表已经与 USERS 和 COMPETITIONS 表有关系。

谢谢

【问题讨论】:

    标签: sql foreign-keys relationship


    【解决方案1】:

    好的,我想明白了这个问题。在我看来,这两种选择各有优缺点。

    1. 对于第一个选项,唯一的优点是可以创建必须简单的查询来检索数据,因为您不需要执行很多 JOIN 操作,因为用户的主键已经在图片中,但是这个解决方案有一个缺点,数据冗余。
    2. 此解决方案的数据冗余较少,但查询可能更复杂。

    总的来说,我更喜欢第二种解决方案,但您应该根据自己的需要来决定,如果您是一个具有大量复杂查询的系统并且您需要一个非常快速的应用程序,那么您应该选择第一种。

    【讨论】:

      【解决方案2】:

      好的,所以这取决于图片的用途超出您提到的范围。

      • 在您的示例中,要使Pictures 引用UsersCompetitions,所有Pictures 必须属于用户和竞争。在那种情况下,也许他们应该被称为Submissions。但这是一个很好的模型。

      • 在另一种情况下,我们引用了这个关系表Participated_competitions,它似乎是一个不必要的“中间人”,用于将图片连接到一个用户在比赛中的条目。

      因此,您可以使用另一种方法对其进行建模,这样您就可以在比赛之外拥有Pictures。也许是个人资料图片?

      这是架构:

      表格

      Users(_id_, username)
      
      Competitions(_id_, name)
      
      Pictures(_id_, picture)
      

      关系

      Participations(_user_, _competition_, picture)
      user -> Users.id
      competition -> Competitions.id
      picture -> Pictures.id
      

      (这是一个复合键,用户和竞争都是主键。

      这允许多个用户参加一个比赛,一个用户可以参加不同的比赛。 不允许一个用户多次参加同一个比赛,所以不能向同一个比赛提交多张图片。

      你可以改成:

      Participations(_user_, _competition_, _picture_)
      user -> Users.id
      competition -> Competitions.id
      picture -> Pictures.id
      

      ,如果您希望用户能够为一场比赛提交多张图片。

      请注意,这允许用户在多个比赛中重复使用图片。如果您想限制这一点,请将UNIQUE(picture) 约束添加到Participations

      总而言之,无论您是创建一个表Pictures(user, competition, picture) 像您的第 1 点 还是像我的示例中的 Participations(user, competition, picture),唯一真正的区别是您对 Pictures 的其他用途。就像我说的,您可以将名称更改为 Submissions,这正是我在这里建模的内容。

      希望这对您有所帮助! :)

      【讨论】:

        【解决方案3】:

        1- 我可以将用户表和竞争表的主键作为外键保存在 PICTURES 表中

        就像您可以存储一张图片,其中包含有效的用户和有效的比赛,尽管该用户可能从未参加过该比赛。换句话说,这将允许不一致的数据,因此是一个糟糕的选择。

        2- 我可以在 PICTURES 表中只保留 PARTICIATED_COMPETITIONS 主键作为外键。 PARTICIATED_COMPETITIONS 表已经与 USERS 和 COMPETITIONS 表有关系。

        另一方面,这将强制图片属于用户参与的比赛。所以这显然是更好的选择。

        但是,如果用户只能通过图片参加比赛,您可以完全省略 PARTICIPATED_COMPETITIONS改为让比赛和用户在图片。然后图片会隐含显示谁参加了哪个比赛。

        【讨论】:

          猜你喜欢
          • 2020-02-18
          • 2010-10-13
          • 1970-01-01
          • 2015-12-25
          • 2010-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多