【问题标题】:Best approach cascade deleting related entity in MS SQL最佳方法级联删除 MS SQL 中的相关实体
【发布时间】:2013-09-26 12:56:47
【问题描述】:

需要关于如何为以下场景设计数据库的最佳方法的建议:

下面的数据库结构示例(这不是真的只是解释问题)

File
(
  Id INT PRIMARY KEY...,
  Name VARCHAR(), 
  TypeId SMALLINT, 
  ...
  /*other common fields*/
)
FileContent
(
  Id INT PRIMARY KEY...,
  FileId FOREIGN KEY REFERENCES File(Id) NOT NULL ON DELETE CASCADE UNIQUE,
  Content VARBINARY(MAX) NOT NULL, 
)

Book 
(
   Id INT PRIMARY KEY..., 
   Name VARCHAR(255), 
   Author VARCHAR(255)
   ...
   CoverImageId FK REFERENCES File(Id),
)

BookPageType
(
   Id TINYINT PRIMARY KEY..., 
   Name VARCHAR(50), 
)

BookPage
(
   Id INT PRIMARY KEY..., 
   TypyId TINYINT FOREIGN KEY REFERENCES BookPageType(Id), 
   BookId INT FOREIGN KEY REFERENCES Book(Id) ON DELETE CASCADE,
   Name VARCHAR(100),
   CreatedDate DATETIME2,
   ... 
   /*other common fields*/  
)

BookPage1
(
  Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL  ON DELETE CASCADE, 
  FileId PRIMARAY KEY REFERENCES File(Id)
  ... 
  /* other specific fileds */
)
...
BookPageN
(
  Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL ON DELETE CASCADE, 
  ImageId PRIMARAY KEY REFERENCES File(Id),
  ... 
  /* other specific fileds */
)

现在的问题是我想删除包含所有页面和数据的 Book(它适用于删除级联),但是如何使级联删除关联的文件(1 对 1 关系)。 在这里,我看到了以下方法:

  1. 使用时将文件添加到每个表,但我不想复制文件 每个表的架构
  2. 将外键添加到文件表(例如,而不是页面),但因为我使用文件,例如在 10 个表中,我将在文件表中有 10 个外键。这也不好
  3. 使用触发器,我不想做的事

提前致谢

【问题讨论】:

  • 如果文件和书是一对一的关系,为什么还需要文件表呢?
  • 它也用于其他表格(例如在 Pages 中)。书有封面照片,但书中的页面可能还有其他图像、徽标、附件等(通常是 1 对 1 的关系,每页一个徽标)
  • 在设计数据库时,您通常无法继续。如果您将其设计为 1 对 1,则您只有该选项。那是什么? 1对1,或1对多或多对多。同一张图片可以在多个页面上吗?一个给定的页面可以有多个图像吗?你真的每页都有一个单独的表格吗?
  • 如果一个文件可以用在书 1 的封面和书 2 的一页上,尝试级联删除可能不是最好的办法。

标签: sql sql-server database cascading-deletes


【解决方案1】:

如果出现这种必要,您可能需要重构您的基础。 你说这个例子是不真实的,我不会问 N 个表格的页面,虽然这很奇怪。如果不是所有文件都具有 1 对 1 的关系,因此您只需要删除其他书未引用的文件,这听起来像是触发器的工作。

【讨论】:

  • 也许这不是好名字……但我只更改了真实数据库中的表名
【解决方案2】:

所以您定义的是BookPageFile 之间的多对多关系。这是BookPageBookPageN 之间的一对多关系以及FileBookPageN 之间的一对多关系的结果。要在文本中获得您说想要的关系,您需要将关系从BookPageN 指向File。也许与其拥有这么多BookPageN 表,您可以找到一种方法将它们合并到一个表中。也许只使用BookPage 表。只允许可选字段为空。

【讨论】:

  • 这将是一个非常大的表,大约有 100 列,并且正在增长
  • 如果一个实体有100个或1000个属性,还是放在同一张表中比较好。只要它们是真实的属性。确保对表格进行规范化。删除明细表等的所有重复属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2011-10-12
  • 2013-03-23
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多