最佳方法级联删除MS SQL中的相关实体

时间:2013-09-26 12:56:48

标签: sql sql-server database cascading-deletes

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

以下DB结构exmaple(这不是真正解释问题)

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 relentionship)。 在这里,我看到以下方法:

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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