我可以与弱实体使用多对多关系吗?

时间:2014-12-17 13:59:36

标签: sql oracle database-design relational-database entity-relationship

我有一个实体,例如employe(key employe ID),每个雇员都可以承担多重责任,而每个责任都可以由多个雇员负责。

我有3个选项:

  1. 创建弱实体 - 当关键是来自雇员实体的责任名称和雇员ID时的责任。而实体的那些将具有多对多的关系
  2. 在关系具有属性责任时建立关系.-
  3. 将属性作为键添加到employees(ID,责任)
  4. 第一个选项甚至可能!什么是正确的选择。

2 个答案:

答案 0 :(得分:4)

你有多对多的关系。规范解决方案是使用三个表:

  • 员工
  • 职责
  • EmployeeResponsibility

最后一个表是一个联结表,每个员工和每个职责都有一行。

答案 1 :(得分:0)

常见警告:假设我正确理解了问题......

@GordonLinoff是正确的。您已有一个Employee表。如果每个员工都有多个职责,那么您需要一个Employee_Responsibility表,每个员工和职责组合都有一条记录。您很可能还需要一个责任表,然后Employee_Responsibility包含两个外键:employee_id和responsibility_id。

我不知道您对“责任”保留了哪些数据。我猜至少会有一些文字来描述它。这样的文本并不是一个好的密钥,因为它往往可能很长并且可能会不时更改,所以你应该有一些respons_id,一个简短的代码或一个任意的整数标识符或者其他一些,所以那么你需要一个责任表来将代码与文本相关联。可能还有其他数据。

重新建议的解决方案,让我按相反的顺序进行:

如果我理解您的第3号,您就无法为员工记录添加责任,因为员工可以承担多重责任。如果员工有2个职责,那将迫使您为他创建2个员工记录,并复制所有其他数据。

第2号不起作用,因为没有其他员工与责任相关联。如果鲍勃有“鞋业部门职员”的责任,谁将成为该关系中的另一名员工?我想你可以把他和另一个鞋业部门的职员联系起来,让我们称他为查理。但如果查理退出,那么鲍勃是否不再是鞋业部门的职员?可能不是。也就是说,如果“责任”的性质是它涉及另一名员工 - 比如“责任”意味着“管理这套雇员”,那就不同了。我假设那不是你的想法。

RE号1,它不是一个弱实体,因为你说责任并不是员工所独有的。弱实体是指您拥有依赖于另一个实体的实体。就像你有订单一样,你可能有一个订单标题,标识订单号,订单的日期,客户的名称和地址,付款方式等。然后你会有订单项,一组个别的东西订购。订单商品挂起了订单。没有订单,您不能拥有订单商品,并且给定订单商品只能是一个订单的一部分。 (多个订单可能包含相同的产品,但这是不同的。订单商品记录可能会有某种产品ID作为记录的一部分,但它也会有数据不适用于其他订单,如数量。)但是在这种情况下,责任并非员工所独有。许多员工可以承担同样的责任。