【问题标题】:Can this relation between 2 PKs and 2 FKs exists?2个PK和2个FK之间的这种关系是否存在?
【发布时间】:2026-02-16 18:35:01
【问题描述】:

这张图片代表了我需要制作的数据库中的er图,但我想知道fk_note和id(note table)之间的关系heep,以及fk_users和id(users table)之间的关系是否得到每个人的id请注意,当我使用内部连接进行选择时。

【问题讨论】:

    标签: mysql sql inner-join


    【解决方案1】:

    notes id 和 fk_note 之间的关系不是必需的,因为用户的外键已经将便笺标记为属于特定用户。

    找到所有不属于运行的用户的简单方法

    SELECT n.*,u.* FROM notes n INNER JOIN users u ON n.fk_user = u.id
    

    【讨论】:

    • 但是如果我想知道为每个用户设置了哪个注释,如果不使用 users 表中的 fk_note 怎么办?
    • @TadeoGavensky 运行SELECT n.*,u.* FROM notes n INNER JOIN users u ON n.fk_user = u.id
    【解决方案2】:

    “fk_note”和“fk_user”列都表示相同的关系。两者兼有是不必要的,并且可能导致错误。

    如果每个用户只有一个笔记(或没有),那么:

    • “fk_note”列自己表达完整的关系
    • 如果“fk_user”列也被限制为唯一,则可以表示完整的关系

    在这种情况下,以下两个查询是等效的 - 都返回任何名为“Rowan”的用户的单个注释:

    Select users.id, users.name, notes.id, notes.title
    From users
    Inner Join notes
       On notes.fk_user = users.id
    Where
       users.name = 'Rowan'
    

    Select users.id, users.name, notes.id, notes.title
    From notes
    Inner Join users 
       On users.fk_note = notes.id
    Where
       users.name = 'Rowan'
    

    如果用户可能有多个笔记,那么:

    • “fk_note”列不能存在,因为它没有单个值可供使用
    • “fk_user”列表示完整的关系

    在这种情况下,只有上面的第一个查询(加入notes.fk_user = users.id)是可能的。它将返回所有任何名为“Rowan”的用户的笔记。

    如果用户可以有一个“主要”和多个“次要”注释,那么“fk_note”列可以代表“主要注释”,然后有两个列是有意义的(但是建议选择更好的名称)。

    上面的两个查询会给出不同的结果:

    • 第一个,加入notes.fk_user = users.id 将给出用户的所有辅助注释
    • 第二个,加入users.fk_note = notes.id只给出用户的主要注释

    【讨论】:

    • 好的,IMSop,非常感谢您的帮助!我现在明白为什么 users 表不能有一个 fk 引用注释 id 因为就像你在查询中显示的那样,我的数据库假设是每个用户可以有多个注释
    最近更新 更多