SQL - 删除表条目并归档?
Posted
技术标签:
【中文标题】SQL - 删除表条目并归档?【英文标题】:SQL - Deleting table entries and archiving? 【发布时间】:2014-05-28 15:15:14 【问题描述】:好的,这是我的问题的细分。我有两张桌子:
员工和 Taken_Treatments。以下是每个表的列列表:
员工表:
员工 ID - 主键 员工姓名 - 姓名 员工姓氏 - 姓氏采取_治疗:
治疗 ID - 主键 人员 ID - 外键指的是员工 ID Individula - 外键是指患者 ID 治疗类型 - 外键是指治疗 ID我有 5 名员工和 7 次治疗。
现在问题来了:我解雇了一名员工,因此我必须从员工表中删除他的条目。我已经处理了外键约束,这就是问题开始的地方:我有三个选择:
设置默认值(不同员工的 ID) 将值设置为空 级联:删除引用员工的每一行对于员工表,在同一个表中雇佣和解雇员工并不是一个好习惯。此外,在 Taken_treatments 表上,我不能有员工的空值,我既不想用另一个员工 ID 更新表,也不想用被解雇的医生删除 Taken_Treatment 条目。
所以,我想这样做:我不想永久删除员工,而是将他放到另一个表中(假设是前员工),以便 Taken_Treatment 条目保持不变(类似于归档),这样可能吗? -谢谢-
【问题讨论】:
为什么在标记前雇员的Employee
表中添加一个字段是不合理的?
【参考方案1】:
因为您希望 Taken_Treatment
条目保持不变(这意味着它们仍然指向被解雇的 EmployeeID
,直到您更新它们),所以您不能从表中删除被解雇的员工。外键不能引用一个以上的列,例如您似乎在使用您的Former_Employees 表时要求。
我建议一个简单的TerminationDate
列,对于在职员工来说通常为空,或者如果您不能使用空值,则建议一个引用 EmployeeID 的Terminated_Employees
表。
【讨论】:
如果有人离开然后返回,current_active 字段会更容易。如果需要工作经历,可以进入另一个表。 我通常在数据库中找到"soft-deletes" 的日期为much more useful than bits。此外,我同意完整的历史记录/存档会增加复杂性(其他表),但如果有必要,OP 确实需要说明该要求。【参考方案2】:抱歉,我这里没有明确的答案。您处于一个相当大的冰山一角 - 一个经典的时间数据库问题,可能会出现第四和第五范式问题。这类问题必须在数据库设计阶段解决。
如何设计表取决于数据库的总体用途和目标。引导性问题:
数据要保留多长时间?何时可以将员工从系统中永久删除?何时可以删除 Taken_Treatments? 假设 Taken_Treatments 必须持续很长时间(HIPAA、保险、IRS 等),那么您可能还必须跟踪执行治疗的员工。一张桌子就够了吗?也许一张表用于“当前治疗”……这可能意味着当前员工处理的治疗,以及一张用于“所有治疗”的表,其中未提及哪个员工进行了治疗? 为员工和治疗分别设置一个表可能比为“当前”治疗和员工使用一个表以及为“所有历史”治疗和员工分别设置一个表更有用(并且使用起来当然更简单)。“修复”取决于愿望/要求,正如您所见,它很快就会变得复杂。假设您需要长时间保留数据,并假设营业额,我建议在员工表中添加日期时间列,例如“开始”和“离职”,以便您确定他们何时是“活跃”员工(如果 @ 987654321@,他们是前雇员)。您没有在 Taken_Treatment 中注明“治疗时间”列,这是否与您的业务相关? ......还有很多设计问题。
【讨论】:
如果有人离开,你的推荐会有点冒险,然后返回。 @Bracuk:是的。两种可能的策略,都不理想:(1)有一个子表跟踪从/通过就业期间; (2) 如果被重新雇用,则为新的雇用期重新录入。如果可能重新雇用(季节性工作?),我会使用第一个,如果重新雇用不太可能,我会使用第二个。或者 (3) 如果不需要跟踪“停机时间”,只需在重新雇用时重新设置“离职”日期——在员工“休假”期间不应该有引用员工的日期敏感数据。 我的 Taken_Treatment 表中有一个名为“Treatment Taken”的列,它是一个“日期”类型的列。我还必须指出,我可以随时重新创建数据库,它是一个带有表格和少量条目的简单数据库(学校项目)。我有一个很长的查询文件,它再次删除并重新创建数据库表和条目。如果我丢失任何数据,因为它们是虚构的,这不是问题,但我想知道像归档系统这样的东西是否可能。以上是关于SQL - 删除表条目并归档?的主要内容,如果未能解决你的问题,请参考以下文章
sql 存储过程,删除Postgres中所有表中的所有条目而不删除或截断,并使用可选的忽略。