【问题标题】:Database Table with two related Foreign Keys, that may take wrong data具有两个相关外键的数据库表,可能会获取错误的数据
【发布时间】:2013-05-03 17:33:41
【问题描述】:

我正在设计一个数据库,我的表如下

  • 一个公司可以有多个部门,一个部门属于一个公司
  • 一个公司可以有多个员工,一个员工属于一个公司
  • 一个部门可以有很多员工,一个员工属于一个部门
公司( ID, 姓名, ) 部( ID, 标题, 公司 ID(FK_Department_Company) 唯一(标题,公司 ID) ) 员工( ID, 姓名, 姓名, 公司 ID,(FK_Employee_Company) 部门 ID (FK_Employee_Department) )

所以我发现有可能插入错误的数据 进入员工表

这里是样本值

company  (
       25,Spar Pvt LTD, Sweden, 12345678.
       26,Mr.Wheel Pvt Ltd, Germany, 123456789)

Department(
       101, Manager,25
       102, Front Desk,25
       103, Host,26)

Employee( 81,25,103,....) 

这里 DepartmentID 103 属于 CompanyID 26,但我仍然可以插入, 那么有没有办法解决这个问题(sqlserver), 或者我必须改变设计,请给我一些建议和想法。

问候,

【问题讨论】:

  • 员工表上不需要公司 ID 列。 Departments 表与 Companies 表相关,员工与 Departments 相关,您可以通过这种方式插入正确的数据并获取所需的任何数据。

标签: sql database database-design foreign-key-relationship


【解决方案1】:

员工表中不需要 CompanyID

根据您上面的 2 个陈述

  • 一个公司可以有多个部门,一个部门属于一个公司
  • 一个部门可以有很多员工,一个员工属于一个部门

这意味着

  • 一个公司可以有多个员工,一个员工属于一个公司

因此,Employee-Company 关系隐含在中间的 Department 表中。不需要单独的外键/列

tl;dr:由以下断言标识:“......一名员工属于一家公司”。

【讨论】:

  • 荣誉。另一种说法是,员工表中的 companyid 重复了一个事实,该事实已经存储在从员工到部门的 FK 以及从部门到公司的 FK 的命令中。当同一事实在数据库中多次陈述时,数据库可能会自相矛盾。遵循规范化原则可以避免该问题。
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 2017-01-10
  • 1970-01-01
  • 2019-08-12
  • 2011-10-23
  • 2020-10-04
  • 2018-07-06
  • 1970-01-01
相关资源
最近更新 更多