【发布时间】: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 关系)。 在这里,我看到了以下方法:
- 使用时将文件添加到每个表,但我不想复制文件 每个表的架构
- 将外键添加到文件表(例如,而不是页面),但因为我使用文件,例如在 10 个表中,我将在文件表中有 10 个外键。这也不好
- 使用触发器,我不想做的事
提前致谢
【问题讨论】:
-
如果文件和书是一对一的关系,为什么还需要文件表呢?
-
它也用于其他表格(例如在 Pages 中)。书有封面照片,但书中的页面可能还有其他图像、徽标、附件等(通常是 1 对 1 的关系,每页一个徽标)
-
在设计数据库时,您通常无法继续。如果您将其设计为 1 对 1,则您只有该选项。那是什么? 1对1,或1对多或多对多。同一张图片可以在多个页面上吗?一个给定的页面可以有多个图像吗?你真的每页都有一个单独的表格吗?
-
如果一个文件可以用在书 1 的封面和书 2 的一页上,尝试级联删除可能不是最好的办法。
标签: sql sql-server database cascading-deletes