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

断了今生、忘了曾经 提交于 2019-12-23 05:06:52

问题


I am building an database schema for a project and I am bit stuck on this issue. I have 2 tables:

USER table:

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

CONTACT 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

Each of the users in USER will have a contact in CONTACT. If a user has a single contact then I can use a foreign key relationship on Contact_ID in USER and build the relationship between them.

But what if an user in the USER table has multiple contacts in the CONTACT table? I am not sure how to build the relationship between them.

Eg: In USER for user Charan there is one contact, contact 2, but what if there is one more, contact 4? In that case how can I build the many to one relationship?


回答1:


It looks like you've got it backwards. Your CONTACT table should have a foreign key reference to USER table, rather than USER containing a foreign key reference to CONTACT. For example:

USER table

Id  Name 
1   Arun  
2   Barath 
3   Charan 
4   Dinesh 

CONTACT 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

Of course, I just used fake data for the new USER_ID column. As you can see, USER with Id 1 (Arun) has multiple contacts (IDs 1 and 3) in the CONTACT table.




回答2:


In the relational model (and ER model) tables represent (business/application) relationships/associations. FKs (foreign keys) are called "relationships" by pseudo-relational (& pseudo-ER) methods.

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

If user_has_contact is N:1 in uid:cid then you can replace user & user_has_contact by:

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

If user_has_contact is 1:N in uid:cid then you can replace contact & user_has_contact by:

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

You should use the first design for M:M. (You don't actually have to but then the joined tables exhibit problems that normalization would tell you to solve by having the separate tables.) This is called an association/junction/join/many-to-many/bridge table in methods that call FKs "relationships". But like every table it represents a relationship/association on some values. (And hence also any identified entities.) It also handles M:0-or-1 & 0-or-1:M . The other two designs can do that too using NULL.

Regardless of the cardinality of user_has_contact it is probably a good idea to keep the three separate because it is straightforward. (True ER modeling would give the two entity tables & one association table.) But you should realize that there is no need to join them.

A FK tells the DBMS that values for a list of columns in a table must appear as a CK (candidate key) elsewhere. (In SQL, a FK says they appear as a superkey, ie SQL PK (primary key) or UNIQUE NOT NULL, elsewhere.)

(Methods that call FKs "relationships" do so because FKs are associated with relationships like user_has_contact that have be joined into what becomes the referencing table. Also it is those relationships' cardinalities that are called the FKs' cardinalities. But a FK constraint just states a fact; it isn't a relationship/association.)

You need to find & follow references for information modeling & database design.



来源:https://stackoverflow.com/questions/45251192/how-to-establish-a-many-to-one-relationship-between-2-tables-for-a-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!