如何强制执行数据库自联接(或者有更好的方法)

时间:2009-11-28 13:45:59

标签: sql database-design data-modeling

我在数据库中有一个员工表,我想将员工与他们的经理联系起来:

员工

  • employee_id
  • 如first_name
  • 姓氏
  • MANAGER_ID

如果manager_id只是同一个表中经理将其作为员工的另一行,那么强制执行该操作的最佳方法是,如果我删除员工,则会验证该员工不是其他员工的经理? / p>

对此有更好的最佳做法吗?

4 个答案:

答案 0 :(得分:2)

您可以使用外键约束(不进行级联删除)。如果您尝试删除仍有其他员工的经理,数据库将自动检测到该操作并且操作将失败。

答案 1 :(得分:2)

您可以使用自我加入,就像您使用 PK &加入其他桌子一样的 FK

我认为你应该设计一些需要考虑的事情。例子:

  • 不同的经理:Tom今天是Jr. Pgmr,Jerry今天是他的经理。明天汤姆可能会向塞巴斯蒂安报到。
  • 促销: Tom今天是Jr. Pgmr,Jerry今天是他的经理。明天汤姆可能会自己成为一名经理并让人向他汇报。
  • 促销活动2: Tom可能会从Jr Pgmr转到Sr Pgmr,再到项目主管团队负责人。你想保存吗?
  • 报告:您可能希望在某个时间点显示层次结构(某些用户迟早会要求此报告)

您可能需要考虑将数据拆分为单独的实体 - 按如下方式对数据进行规范化(或根据您的需要进行规范化)

  • 员工表:基本员工信息
  • 职位查询表:组织中所有职位的列表
  • 员工职位表:跟踪员工发生职位变更时的开始日期和结束日期。
  • 员工职位层次结构表:员工职位向另一个员工职位报告的内容(使用双联接而非自联接);开头和结束时间戳

答案 2 :(得分:0)

使用外键,这是一个“通常”的方法:

employee_model_01

答案 3 :(得分:0)

如果您的应用程序(或组织)发展,请使用多对多关联来覆盖您的基础。

Employee.Employee_id  <- EmployeeManager.Employee_id 
                         EmployeeManager.Manager_id -> Employee.Employee_id
                         Manager_role_type
                         etc.

始终使用外键约束。