【问题标题】:What does a table with only 2 foreign keys do?只有 2 个外键的表有什么作用?
【发布时间】:2016-05-28 15:29:00
【问题描述】:

我研究了 MySQL,并且遇到了这个有趣的 ERD。除了这里的user_chat 表,我了解所有这些。它有 2 个外键引用表 chatuser。那到底有什么作用?这是否意味着:

  1. 有新聊天时我必须手动INSERT INTO message, chat, user_chat
  2. 我只能用这个user_chat 表做SELECT 语句?
  3. user_chat 不能包含其他列,例如 favorite,以防人们想要快速访问它?
  4. 我可以删除user_chat 表中的一行,因为它们不是unique

我正在自学,并且仍然是该主题的初学者,因此如果可以对此进行解释以帮助我理解它,那将意义重大。非常感谢!

【问题讨论】:

    标签: mysql foreign-keys foreign-key-relationship erd


    【解决方案1】:

    userchat之间是多对多的关系,也就是说一个用户可以参与多个聊天,每个聊天可以有多个用户参与。

    这种关系不可能直接用FOREIGN KEY约束来表示,只能强制一对多的关系。为解决此问题,数据库设计人员使用“交叉实体”表,如 user_chat,它允许将多对多关系简化为“一对多对一”关系。

    当您创建新聊天时,您会在user_chat 中为每个参与者以及任何加入正在进行的聊天的新参与者插入一条记录。此示例中此交集的主要用途是让您可以轻松搜索聊天中的所有参与者(例如,以通知他们有新消息),或查找特定用户参与的所有对话。

    【讨论】:

    • 感谢您的帮助。在user_chat 表中,我是否应该在两个外键上添加UNIQUE 约束以避免重复?这是一个好习惯吗?
    • 您应该创建一个包含两列的复合主键,而不是 UNIQUE 约束。
    • 是的,对不起,是通常的做法。
    【解决方案2】:

    是的,这类只有 2 个外键的表主要用于登录目的。 它只是一个连接/关系而已。 它有助于轻松提取数据

    【讨论】:

      【解决方案3】:

      在关系数据库中,不可能实现多对多关系。在这种情况下,ChatUser 具有多对多关系。我们需要通过引入一个“associative entity”来将多对多关系分解为一对多关系,其中包含作为每个表的外键的 2 列。在这种情况下,user_chat 充当关联实体。

      【讨论】:

        猜你喜欢
        • 2010-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 2014-10-17
        • 1970-01-01
        相关资源
        最近更新 更多