带外键的sqlserver数据库设计

带外键的sqlserver数据库设计,sql,sql-server,database,foreign-keys,Sql,Sql Server,Database,Foreign Keys,我有以下部分数据库设计: 所有表格都相互依赖,因此表格bvd_docflow_子文档依赖于表格bdd_docflow_子集 表bvd_docflow_子文档依赖于bvd_docflow_子集。所以我想我可以聪明地在每个表上使用外键(以及在DELETE CASCADE上使用外键)。然而,FK正在深入调查我在表格中的位置 问题在于表bvd_docflow_documents没有指向1docflow_documentset_id`PK/FK的引用。有没有一种方法(也许我的设计很糟糕)只有站在上面的表

我有以下部分数据库设计:

所有表格都相互依赖,因此表格
bvd_docflow_子文档
依赖于表格
bdd_docflow_子集

bvd_docflow_子文档
依赖于
bvd_docflow_子集
。所以我想我可以聪明地在每个表上使用外键(以及在DELETE CASCADE上使用外键)。然而,FK正在深入调查我在表格中的位置

问题在于表
bvd_docflow_documents
没有指向1docflow_documentset_id`PK/FK的引用。有没有一种方法(也许我的设计很糟糕)只有站在上面的表在表之间有FK关系,而不是上面的所有表

编辑:

更多说明:

bvd_docflow_子集中
存储了有关创建文档的对象的信息。该表与
bvd_docflow_子文档
表之间存在关系(此表存储有关子集的所有文档的主数据。(
docflow_subset_id
在两个表中)。这是这些文档与表之间的链接

进一步往下看,我们还得到了表
bvd_docflow_文档
此表包含实际文档数据。
bvd_docflow_文档
bvd_docflow_子文档
之间的链接是
bvd_docflow_子文档

在每个表上,我都定义了一个外键,因此当删除表上的数据时,链接到该数据的所有数据都会被删除

但是,当我们查看
bvd_docflow_文档
表时,它具有来自其他表(docflow_subset_id和docflow_documentset_id)的所有外键,存在问题。该
bvd_docflow_文档
表所需的唯一外键是
docflow_子文档

编辑2

我进一步修改了我的设计,删除了初次导入数据后不需要的信息

有关(总体)数据库设计,请参见以下链接:

子集
子文档
文档
之间存在多对多关系,因此我认为如果我为这些表定义了所有不同的键,那么在这3个
文档和子文档
之间建立一个表就是一条出路


我不习惯先设计然后构建数据库。但是,对于所有事情来说,都是第一次,我尝试创建一个使用标准并正确使用SQL Server功能的数据库。

我将处理最底层的表,而忽略其余大部分

但首先是一些评论。你的模式只是一个系统的模型。要提供反馈,你必须理解这个“系统”以及评估模型的实际工作方式。此外,了解实体以及选择实体并以指定方式对其建模的原因非常重要。如果不了解所有这些基于经验的猜测,这一点很重要

和另一条评论。在每个表中插入标识列只是一种懒惰。其他人会不同意,但你也需要强制执行所有自然键。你有自然键吗?很少没有任何。强制执行那些确实存在的键

最后一条评论。停止用表名作为列名前缀的荒谬模式。你应该认真考虑使用很长的表名。鉴于你所拥有的,我感觉你需要一个docflow模式

对于documents表,您当前的PK毫无意义。同样,您在表中添加了一个标识列。该列本身就是表的键。包含任何其他列都不会使该键变得更“唯一”-包含是逻辑上的废话。按照您的模式,您会将标识列指定为主键。但是

根据您的图像,documents表只与一个子文档相关。您向该表添加了一个与图像匹配的外键。您还向“更高”的表添加了其他列和外键。因此,现在文档“指向”指向特定子文档。它还指向特定子集-可能与子文档没有关系。同样的想法也适用于其他FK。我怀疑这在逻辑上是正确的。那么为什么这些列(和相关FK)会存在吗?也许这是过早优化的结果——每个人都知道这是所有邪恶编码的根源。同样,不可能知道这对您的模型是否“正确”甚至“有用”

要回答您的问题“…有办法吗”,答案显然是肯定的。您删除了您投诉的列。您添加了它们-为什么?这可能是您使用的工具的问题吗

还有一些最后的评论。“varchar(50)”没有什么特别之处。也许这是一个稍后会更新的占位符。这也可能是懒惰的另一个标志。一般来说,名为“type”和“code”的列往往是“lookup”的外键表-因为人们喜欢随着时间的推移添加、修改或删除这些分类值。我还担心表之间的列名重叠。“位置”存在于多个表中,action_代码和action_id也是如此。还有一个名为“id”(action_id)的列建议查找另一个表-是吗?应该是吗?操作id和操作代码之间是否存在关系?从远处看,无法回答这些问题

但设计数据库更像是艺术而不是科学。有时你只需要创建一些东西,用一些样本数据填充它,然后确定它是否适合你的需要。每个人都会在第一次尝试中出错。这是意料之中的;这就是你如何做到的