SQL - 删除表条目和存档?

时间:2014-05-28 15:15:15

标签: sql

好的,这是我的问题的细分。我有两张桌子:

员工和Taken_Treatments。以下是每个表的列列表:

员工表:

  • Empolyee ID - 主键
  • 员工姓名 - 姓名
  • 员工姓氏 - 姓氏

Taken_Treatments:

  • 治疗ID - 主要密钥
  • 人员ID - 外键是指员工ID
  • 个人 - 外键是指患者ID
  • 治疗类型 - 外键是指治疗ID

我有5名员工和7次治疗。

现在问题是:我解雇了一名员工,因此我必须从员工表中删除他的条目。我已经处理了外键约束以及问题开始的地方:我有三个选择:

  • 设置默认值(不同员工的ID)
  • 将值设置为空
  • 级联:删除员工所指的每一行

对于员工表,在同一个表中雇用和解雇员工不是一个好习惯。此外,在Taken_treatments表上,我不能为员工提供空值,我也不希望既不用另一个员工ID更新表,也不想用被解雇的医生删除Taken_Treatment条目。

所以,我想这样做:我不想永久地删除员工,而是想把他放到另一张桌子上(比如前雇员)所以Taken_Treatment条目保持不变(比如存档),这样的事情是可能的吗? - 谢谢 -

2 个答案:

答案 0 :(得分:1)

对不起,我这里没有明确的回答。你正处于一个相当大的冰山一角 - 一个典型的时态数据库问题,加上可能的第四和第五范式问题。在数据库设计阶段必须解决这类问题。

如何设计表格取决于数据库的总体目的和目标。主要问题:

  • 数据要持续多长时间?员工何时可以永久性地从系统中删除?何时可以删除Taken_Treatments?
  • 假设Taken_Treatments必须持续很长时间(HIPAA,保险,IRS等等),那么您可能必须跟踪执行治疗的员工。一张桌子足够吗?也许有一个“当前治疗方法”的表格......这可能意味着当前员工处理的治疗方法,以及一个“所有治疗方法”的方法,但没有提到哪个员工进行了治疗?
  • 对于员工和治疗而言,每个人都有一个表可能比“当前”治疗和员工以及“所有历史”治疗和员工都有一个更有用(当然也更简单)。

“修复”取决于欲望/要求,正如您所看到的那样,它很快变得复杂。假设您需要长时间保留数据并假设营业额,我建议在Employees表中添加“Started”和“Departed”等日期时间列,以便您确定他们何时是“活跃”员工(如果{ {1}},他们是前雇员。您没有在Taken_Treatment中指出“治疗时间”栏,这是您的业务的相关属性吗? ......以及设计问题上的问题。

答案 1 :(得分:1)

因为您希望Taken_Treatment条目保持不变(这意味着它们仍然指向被解雇的EmployeeID,直到您更新它们),您无法从表中删除已解雇的员工。外键不能引用多个列,例如您似乎要求使用Former_Employees表。

我建议一个简单的TerminationDate列,对于活跃的员工通常为空,或者如果您不能使用空值,则建议引用EmployeeID的Terminated_Employees表。