2011-11-10 153 views
1

我正在建模一个关系数据库,其中以下模式用于描述两个表:ERD ModelMySQL外键依赖关系解析

指定的规则是:

  1. 的办公室有一个经理
  2. 每名工作人员被分配到一个办公室

为了模拟这种我用ERD MySQL工作台创建,其中提供了以下DDL

我的问题是,为了强制办公室必须有一个经理,办公室表中的外键不可空。同样,员工表中代表他们工作的办公室的外键对于每个员工都是必需的,因此而不是可以为空。这在模型中对我来说很有意义,但是对于实现来说,它使得不可能插入数据,因为每个数据都依赖于表中元组的存在。

我能想到的唯一答案是使键可以为空,以便一个人可以暂时存在而没有另一个。

这是解决问题的正确方法吗?数据库最终将被归一化为3NF或BCNF。

回答

1

问题是你试图记录两次办公室和员工之间的关系。一旦进入办公室记录并再次进入员工记录。你应该只记录一个地方的关系。通常这是在具有两列的交叉引用表中完成的:Office_ID和Staff_ID。但是,跳过第三个表并仅记录其中一个表中的关系也很常见。

在这种情况下,您可以通过从Staff表中删除Office字段和外键来消除您的问题。您可以根据需要创建尽可能多的员工记录。然后,当您创建一个办公室记录时,您将可以将其中一个员工分配给该办公室。

+0

感谢您的回复。我确实考虑过这个。因此,如果我使用复合主键(Staff_ID + Office_Id)创建中间表,那么我将如何将一位经理分配到办公室。我可以将管理器外键保留在办公室表格中,但让它在交叉引用表中引用一行吗?再次感谢 –

+0

如果您使用中间表,您将从Office中删除“管理器”字段,并将中间表的外键添加到“职员”和“办公室”。如果您在中间表中使用复合主键,则您可以在每个办公室插入多个管理员。您可以使用Office_Id作为唯一的主键,以便每个Office在中间表中只有一条记录。虽然如果你这样做,那么你根本不需要中间表,并且可以使用Office表中的管理员字段,因为办公室到管理员是1:1。 –