MS SQL中删除相关实体的最佳方法
需要关于如何为以下场景设计DB的最佳方法的建议: 下面是exmaple数据库结构(这不是真的,只是解释一下问题) 现在的问题是,我想删除包含所有页面和数据的书籍(这对delete cascade很有效),但如何使cascade也删除相关文件(1对1关系)。 在这里,我看到了以下方法:MS SQL中删除相关实体的最佳方法,sql,sql-server,database,cascading-deletes,Sql,Sql Server,Database,Cascading Deletes,需要关于如何为以下场景设计DB的最佳方法的建议: 下面是exmaple数据库结构(这不是真的,只是解释一下问题) 现在的问题是,我想删除包含所有页面和数据的书籍(这对delete cascade很有效),但如何使cascade也删除相关文件(1对1关系)。 在这里,我看到了以下方法: 使用时将文件添加到每个表中,但我不想复制文件 每个表的模式 将外键添加到文件表中(例如,而不是页面),但由于我使用文件,例如在10个表中,我将在文件表中有10个外键。这也不好 使用触发器,我不想做的事 提前感谢如果
提前感谢如果有必要,也许你需要重构你的基础。
你说这个例子是不真实的,我不会问关于N个表的页面,尽管这很奇怪。如果不是所有的文件都有1对1的关系,那么您只需要删除其他书籍没有引用的文件,这听起来像是一个触发器的作业。那么您定义的是
BookPage
和file
之间的多对多关系。这是由于BookPage
和BookPageN
之间存在一对多关系,然后是文件
和BookPageN
之间存在一对多关系。要在文本中获得所需的关系,需要将关系从BookPageN
转到File
。也许你不需要那么多BookPageN
表,而可以找到一种方法将它们合并到一个表中。也许只需要使用BookPage
表即可。只允许可选字段为空。如果文件和书本之间存在1对1的关系,为什么需要文件表?它还用于其他表(在eample页面中)。书中有封面照片,但书中的页面也可能有其他图像、徽标、附件等(通常是1对1的关系,每页一个徽标),在设计数据库时,通常无法继续。如果将其设计为1对1,则只有该选项。那是什么呢?1对1,或1对多或多对多。同一图像可以在多个页面上吗?一个给定页面可以有多个图像吗?你真的为每一页都有一个单独的表吗?如果一个文件可以在第1本书的封面和第2本书的某一页上使用,那么尝试级联删除可能不是最好的方法。例如,它可能不是好名字。。。但是我只更改了表名,而不是真正的数据库。这将是一个非常大的表,大约有100列,而且它正在增长。如果一个实体有100或1000个属性,最好将它们放在同一个表中。只要它们是真实的属性。确保将表规范化。删除详图表等的任何重复属性。
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 */
)