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

How to establish a many to one relationship between 2 tables for a field

我正在为一个项目构建数据库模式,但我有点卡在这个问题上。我有 2 tables:

用户table:

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

联系table:

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 table 中的用户在 CONTACT table 中有多个联系人怎么办?我不确定如何建立它们之间的关系。

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

看来你搞反了。您的 CONTACT table 应该具有对 USER table 的外键引用,而不是包含对 CONTACT 的外键引用的 USER。例如:

用户table

Id  Name 
1   Arun  
2   Barath 
3   Charan 
4   Dinesh 

联系table

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 table.

中有多个联系人(ID 为 1 和 3)

在关系模型(和ER模型)中tables表示(business/application)relationships/associations。 FK(外键)通过伪关系(和伪 ER)方法调用"relationships"。

-- 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_contactuid 中是 N:1:cid 那么你可以将 user & user_has_contact 替换为:

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

如果 user_has_contactuid 中是 1:N:cid 那么您可以将 contact & user_has_contact 替换为:

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

您应该为 M:M 使用第一个设计。 (您实际上 没有 ,但是加入的 table 表现出标准化会告诉您通过使用单独的 table 来解决的问题。)这在调用 FKs "relationships" 的方法中被称为 association/junction/join/many-to-many/bridge table。但就像每个 table 一样,它代表某些值的 relationship/association。 (因此还有任何已识别的实体。)它还处理 M:0-or-1 & 0-or-1:M 。其他两个设计也可以使用 NULL.

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

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

(调用 FKs "relationships" 的方法这样做是因为 FKs 与 user_has_contact 等关系相关联,这些关系已加入成为引用 table 的内容。也是这些关系'称为 FK 基数的基数。但是 FK 约束只是陈述一个事实;它不是 relationship/association。)

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