如何为一个字段在两个表之间建立多对一关系
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_contact
在 uid
中是 N:1:cid
那么你可以将 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 使用第一个设计。 (您实际上 没有 ,但是加入的 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。)
您需要查找并遵循信息建模和数据库设计的参考资料。
我正在为一个项目构建数据库模式,但我有点卡在这个问题上。我有 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_contact
在 uid
中是 N:1:cid
那么你可以将 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 使用第一个设计。 (您实际上 没有 ,但是加入的 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。)
您需要查找并遵循信息建模和数据库设计的参考资料。