【问题标题】:How to establish a many to one relationship between 2 tables for a field如何在一个字段的两个表之间建立多对一关系
【发布时间】:2017-12-28 07:18:07
【问题描述】:

我正在为一个项目构建数据库架构,但我有点卡在这个问题上。我有 2 张桌子:

USER 表:

Id  Name    Contact_ID
1   Arun    2
2   Barath  3
3   Charan  2
4   Dinesh  1

联系表:

ID  Name    Phone   Mail
1   Mahesh  1234    Mahesh@Yahoo.com
2   Suresh  54321   Sureh@Google.com
3   Jayesh  9876    Jayesh@Bing.com
4   Ganesh  98754   Gahesh@Safari.com

USER 中的每个用户都会在 CONTACT 中拥有一个联系人。 如果用户有一个联系人,那么我可以在 USER 中的 Contact_ID 上使用外键关系并建立它们之间的关系。

但是如果 USER 表中的用户在 CONTACT 表中有多个联系人怎么办?我不确定如何建立它们之间的关系。

例如: 在用户 Charan 的 USER 中有一个联系人,联系人 2,但如果还有一个联系人,联系人 4 怎么办? 在这种情况下,我该如何建立多对一关系?

【问题讨论】:

    标签: sql database-design foreign-keys primary-key many-to-one


    【解决方案1】:

    看起来你把它弄反了。您的 CONTACT 表应该有对 USER 表的外键引用,而不是 USER 包含对 CONTACT 的外键引用。例如:

    用户表

    Id  Name 
    1   Arun  
    2   Barath 
    3   Charan 
    4   Dinesh 
    

    联系表

    ID  Name    Phone   Mail                USER_ID
    1   Mahesh  1234    Mahesh@Yahoo.com    1
    2   Suresh  54321   Sureh@Google.com    2
    3   Jayesh  9876    Jayesh@Bing.com     1
    4   Ganesh  98754   Gahesh@Safari.com   3
    

    当然,我只是为新的 USER_ID 列使用了假数据。如您所见,ID 为 1 (Arun) 的 USER 在 CONTACT 表中有多个联系人(ID 1 和 3)。

    【讨论】:

    • 非常感谢
    【解决方案2】:

    在关系模型(和 ER 模型)中,表代表(业务/应用程序)关系/关联。 FK(外键)通过伪关系(& 伪 ER)方法称为“关系”。

    -- user "id" has name "name" and ...
    user(id, name, ...)
    -- contact "id" has name "name" and ...
    contact(id, name, ...)
    -- user "uid" has contact "cid"
    user_has_contact(uid, cid)
    

    如果user_has_contact 在uid:cid 中是N:1,那么您可以将user 和user_has_contact 替换为:

    --    user "id" has ... AND user "id" has contact "cid"
    user(id, name, ..., cid)
    

    如果user_has_contact 在uid:cid 中为1:N,那么您可以将contact 和user_has_contact 替换为:

    --    contact "id" has ... AND user "uid" has contact "id"
    contact(id, name, ..., uid)
    

    您应该为 M:M 使用第一个设计。 (您实际上并没有有,但是连接表会出现问题,规范化会告诉您通过拥有单独的表来解决。)这称为关联/连接/连接/多对-调用 FK“关系”的方法中的许多/桥表。但就像每个表一样,它代表某些值的关系/关联。 (因此还有任何已识别的实体。)它还处理 M:0-or-1 & 0-or-1:M 。其他两种设计也可以使用NULL。

    不管user_has_contact 的基数如何,将这三个分开可能是个好主意,因为它很简单。 (真正的 ER 建模会给出两个实体表和一个关联表。)但是您应该意识到没有需要加入它们。

    FK 告诉 DBMS,表中列列表的值必须在其他地方显示为 CK(候选键)。 (在 SQL 中,FK 表示它们在其他地方显示为超键,即 SQL PK(主键)或 UNIQUE NOT NULL。)

    (将 FK 称为“关系”的方法之所以这样做,是因为 FK 与 user_has_contact 之类的关系相关联,这些关系已加入成为引用表的内容。这些关系的基数也称为 FK 的基数。但是FK 约束只是陈述一个事实;它不是关系/关联。)

    您需要查找并遵循信息建模和数据库设计的参考资料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 2011-02-26
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多