在EER图中使用主键和外键

时间:2011-05-06 01:21:22

标签: mysql database database-design eer-model

在我的数据库中我有三个表(我有更多但是情况相同,用户可以是公司或单人)。

  • Users有一个主键id_user;
  • Company有一个主键id_company和一个外键users_id_user;
  • job_offers有一个主键id_job_offers和两个外键:company_id_companycompany_users_id_user

我的问题是:

  1. job_offers中的主键是否有意义?我认为没有理由这样做。
  2. job_offers有两个外键,一个与company相关,另一个与users相关。这有问题吗?是否存在另一种完成相同任务的方法?
  3. EER

4 个答案:

答案 0 :(得分:2)

所有表都应该有一个主键。听起来你问的是你的主键应该是代理键还是自然键

您可能也会问其他表格的相同问题。例如,假设用户表中的电子邮件列是必需且唯一的,则可以将其用作(自然)主键。

这个问题备受争议,两种方法都可以起作用(也可以采用混合方法)。如果你想一般性地阅读这个主题,请谷歌搜索“自然与代理键”。

答案 1 :(得分:1)

  1. 我认为你是对的。那里不需要单独的id字段。这两个外键应该一起组成表的主键。
  2. 对我来说很好看。

答案 2 :(得分:1)

  

1)理解主键   工作邀请?我认为没有理由

是的 - 每个表都应该有一个主键。它被称为“正常化”。

您的选择可能不是很好。我要说两个外键一起应该是主键,而不是id列。

  

2)工作机会有两个外国人   钥匙,一个与公司和其他相关的钥匙   对用户,有什么问题吗?存在另一个   这种方式(最佳方式)?

不,这就是多少对多的关系。

答案 3 :(得分:1)

  

主键是否有意义   工作邀请?我不认为那里   这是一个原因。

是的。我同意每张桌子都应该有自己的PK。 Should each and every table have a primary key?

  

我有更多,但案件相同,   用户可以是公司还是单身   人

     

job_offers有两个外键,一个   与公司及其他相关   用户。这有问题吗?   是否存在另一种方式   完成同样的任务?

     

系统有两种类型的用户:   普通用户(人)和公司用户。   job_offers是一个保存的表   公司的工作机会。如果一个   公司用户想要发布一份工作,a   记录将插入到   job_offers表。然后一次   普通用户得到这份工作   job_offers.company_user_id_user会   被分配给这个普通用户   用户ID。

但是从您的ER图中,Company.users_id_user是PK,它不能为空,并且此PK在job_offers.company_users_id_user中用作FK。所以job_offers.company_users_id_user也不能为空。

因此,它无法处理公司用户刚刚发布作业,普通用户获得此工作机会或最终没有人获得此工作机会的情况。在这种情况下,job_offers.company_users_id_user应设置为null,违反job_offers.company_users_id_user的非空约束。

我将使用此设计完成相同的任务:

Users
=================
id_user (PK)
email 
activation
password

Company
=================
id_company (PK)
activities 
foundation 
user_id (FK to Users)
description

job_offer
=================
id_job_offer (PK)
id_company (FK to Company)
description_offer 
tags

user_offer
=================
id (PK)
user_id (FK to Users)
job_offer_id (FK to job_offer)