如果表是非常大的(数以百万计基数),而无需登录的DELETE交易,丢弃约束和TRUNCATEing并重新创建约束是远远最有效的方法。另外,如果在其他表中有外键(并且在这个特定的表设计中它看起来如此),那么在所有情况下也必须首先删除这些行。
规范化没有提及递归/层次/树关系,所以我相信在你回复DVK建议将它分解成它自己的表的时候,它是一个红色的鲱鱼 - 它当然可以对此表进行垂直分区并考虑是否可以利用这一点来获得我在下面列出的任何其他好处。正如DVK所暗示的,在这个特别的设计中,我经常看到一个单独的链接表来记录自我关系和其他类型的关系。这有很多好处:
- 有很多很多上下,而不是多到一个(不常见,但可能很有用)
- 跟踪不同类型的直接关系 - 经理,顾问,助理,工资审批,费用审批,技术报告,来 - 与关系和关系型表,而不是在员工表中的新列的行
- 按部就班地进行,包括活动指标和有效的改变在时间上一致的方式层次结构(包括离职员工层次的历史)关系行上的日期 - 这只有在将关系归一化到其自己的表中时才是完全可能的
- SeniorID中的NULL(实际上在任一ID上) - 这是避免错误逻辑的明显优势,但NULL通常会出现在视图中,无论如何您必须将关联表左连接到
- 更好的专用索引策略 - 而不是添加SeniorID到你已经拥有员工的特定索引(尤其是关系类型的数量增长)
当然,与这种关系相关的信息越多,表明关系本身值得一张表(即它是在这个词的真正意义上的“关系”在关系数据库中使用 - 相关数据被存储在一个关系或表 - 与主键),从而为关系的正常形态可能会强烈地表明,关系表在employee表中创建而不是简单的外键关系。
好处还包括其简单的删除场景:
DELETE FROM EmployeeRelationships;
DELETE FROM Employee;
您会在这里对SO注意到一个引人注目的等效性接受的答案,因为,你的情况,没有高层关系的员工有一个NULL - 所以在那个答案海报首先设置NULL为消除关系,然后删除员工。
根据约束(EmpployeeRelationships通常能够被TRUNCATEd,因为它的主键通常是一个组合键而不是任何其他表中的外键),可能有适当的TRUNCATE用法。
这是很清楚的的Jhonny的是最有效和最好的答案,我只留矿为充当一个提醒,有时候我没有,因为我觉得我聪明。 – 2010-03-20 13:41:18
@Larry。因为它会先更新所有行然后删除它们,因此应该效率更低。而不是直接删除。哪个操作更高效,循环或查询?请让我清楚。我不知道这两个 – 2010-03-20 13:43:57
基于集合的命令的想法可能会比运行在一个循环内众多基于集合的命令,即使在后一种情况下每个命令的影响较少的行得更快。实际结果可能会有所不同,例如,表格索引或参考级别数量;你必须测试以确保你有真正的最佳状况。但是Jhonny的“看起来”更好,而且肯定会更清晰,更容易实施。 – 2010-03-20 13:49:28