是什么让这个数据库的级联删除周期性?

时间:2010-09-17 20:56:38

标签: sql database-design sql-server-ce relational-database cascading-deletes

供应商

(PK) - Id
名称

支架

(PK) - Id
VendorId - fk - 如果删除供应商,则级联删除)
命名

项目

(PK) - Id
VendorId - (fk - 如果删除供应商,则级联删除)
名称
价格

UnavailableItem

(PK) - ItemId - (fk - 如果删除项目则级联删除)
(PK) - StandId - (fk - 删除Stand时级联删除)

上面的数据库代表一个体育场馆。

  • 存在多个供应商(Bob's Pizza,Tom's Tacos ......)
  • 每个供应商都有多个展台(Bob's Pizza Concourse A,Bob's Pizza Concourse B ......)
  • 项目由供应商配置,因为特定供应商的所有代表都以相同的价格提供相同的商品
  • Stands可能会耗尽特定项目,因此UnavailableItems表中有一个记录,表示每个项目在给定的展台上变得不可用(使用ItemId和StandId的复合主键)

    问题:

    我可以创建所有内容,直到我添加列出的最后一个外键(FK_UnavailableItem_StandId_Stand_Id)和删除规则:Cascaded

    SQL Compact 3.5(使用VS 2010 Server Explorer)报告以下错误: 参考关系将导致不允许循环引用。

    据我所知,如果我在UnavailableItem表中有一条记录,并且其供应商被删除,它将尝试删除两次:

  • 一次因为它的引用项被删除了。
  • 一次因为其引用的立场被删除了。

    但是,这对我来说似乎不是周期性的。级联删除分支为两个路径(已删除的站点和已删除的项目),这两个路径都在同一条记录中被删除...但它在那里结束。之后没有无限循环的级联删除。我错过了什么,或者这是我正在使用的工具的限制?

    感谢您提供任何帮助!

  • 2 个答案:

    答案 0 :(得分:2)

    您不能通过两个分支级联删除,这是该工具的限制。但是,无论如何,级联删除通常对您的无辜数据库都是一件坏事。从底部表格中删除并向上移动。这样,如果底部有100000000000条记录,您可以批量执行这些记录以获得性能。级联删除可能会导致性能问题。

    答案 1 :(得分:1)

    假设SSCE不允许沿两条路径进行级联删除,则可以删除UnavailableItem.StandId的级联删除。

    至少,当供应商或项目被删除时,它仍然会级联。

    如果UnavailableItem仍然包含已删除Stands的行,那么在构建重新填充订单时,至少可以在使用Stand加入UnavailableItem时将其过滤掉...