1. 级联删除(Cascade Delete)的设计?
级联删除(Cascade Delete)如何设计?它有哪些风险与最佳实践?
- 级联删除的概念与外键约束
- 级联删除的风险(误删、性能、锁)
- 设计替代方案(软删除、归档)
级联删除通过外键约束的 ON DELETE CASCADE 实现,删除父表记录时自动删除子表所有关联记录,保证引用完整性。它简化了删除逻辑,但风险显著:一是误删放大,一次删除可能波及大量下游数据且难以恢复;二是性能与锁,级联删除涉及多表扫描与大量行锁,容易造成锁竞争与长事务;三是隐藏的依赖,业务未必知道级联范围。设计上建议:对关键数据优先用"软删除"(逻辑删除标志位)而非物理删除;确需级联时先评估子表规模与依赖,做完整性校验、分批删除并加事务保护;对审计表、历史表避免级联(防止历史被误清)。PostgreSQL 中删除父表时若子表存在引用会报错,需明确级联行为。
级联删除是"用数据库保证一致"的便捷手段,但风险集中在"不可控的破坏范围";工程上倾向软删除+手动可控的物理清理,必要时用级联但配严格评审与备份。
-- 外键级联删除
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT REFERENCES users(id) ON DELETE CASCADE
);
-- 软删除:使用逻辑删除标志,避免物理删除
ALTER TABLE orders ADD COLUMN deleted_at TIMESTAMPTZ;