我正在为项目构建数据库架构,我对这个问题有点困惑。我有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? 在那种情况下,我如何建立多对一关系?
答案 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约束只是陈述一个事实;它不是关系/关联。)
你需要找到&按照参考资料建模&数据库设计。