1

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

遵循以下数据库结构示例(这不是真实的,只是解释问题)

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 */
)

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

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

提前致谢

4

2 回答 2

0

BookPage因此,您定义的是和之间的多对多关系File。这是 和 之间的一对多关系BookPage以及和BookPageN之间的一对多关系的结果。要在文本中获得您说想要的关系,您需要将关系转为指向 from到。也许您可以找到一种方法将它们合并到一个表中,而不是拥有这么多表。也许只是使用桌子。只允许可选字段为空。FileBookPageNBookPageNFileBookPageNBookPage

于 2013-09-26T13:31:51.120 回答
0

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

于 2013-09-26T13:24:26.543 回答