如何在一个字段的2个表之间建立多对一关系

时间:2017-07-22 05:52:36

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

我正在为项目构建数据库架构,我对这个问题有点困惑。我有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表中有多个联系人怎么办?我不确定如何建立他们之间的关系。

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

2 个答案:

答案 0 :(得分:1)

看起来你已经倒退了。您的CONTACT表应具有USER表的外键引用,而不是包含CONTACT的外键引用的USER。例如:

USER表

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)。

答案 1 :(得分:1)

在关系模型(和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为1:N:cid,那么您可以替换contact& user_has_contact

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

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

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

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

(调用FK“关系”的方法是这样做的,因为FK与user_has_contact之类的关系相关联,这些关系已经被加入到引用表的内容中。而且这些关系的基数被称为FKs的基数但是FK约束只是陈述一个事实;它不是关系/关联。)

你需要找到&按照参考资料建模&数据库设计。