Sql ER图中的循环:糟糕的设计?BCNF?

Sql ER图中的循环:糟糕的设计?BCNF?,sql,database,database-design,foreign-keys,database-normalization,Sql,Database,Database Design,Foreign Keys,Database Normalization,我想在我的数据库中建模语言语法树。在我的设计中,语法树由内部节点和终端节点组成;这两种类型的节点都是弱实体类型,由它们所属的语法树标识。语法树本身也是弱实体;它们由它们所代表的句法结构的句子来识别。一个给定的句子可能有多个语法树。 终端节点可以与其语法树所标识的句子中的标记关联1:m关系。标记也是由它们所属的句子标识的弱实体 因此,总体而言,在将ER图转换为关系模式后,我的一些关系模式如下所示: 句子ID 合成素 tokensentenceID,tokenDiscr TerminalNodeSe

我想在我的数据库中建模语言语法树。在我的设计中,语法树由内部节点和终端节点组成;这两种类型的节点都是弱实体类型,由它们所属的语法树标识。语法树本身也是弱实体;它们由它们所代表的句法结构的句子来识别。一个给定的句子可能有多个语法树。 终端节点可以与其语法树所标识的句子中的标记关联1:m关系。标记也是由它们所属的句子标识的弱实体

因此,总体而言,在将ER图转换为关系模式后,我的一些关系模式如下所示:

句子ID

合成素

tokensentenceID,tokenDiscr

TerminalNodeSentencedFromTree、TreeDiscovery、nodeID、sentenceIDFromToken、tokenDiscr

如您所见,terminalNode的关系模式包含两个外键,每个外键引用一个sentenceID:一个保存语法树表示的句子的ID,另一个保存令牌所属句子的ID。当然,这些句子的值总是需要相同的。因此,对于terminalNode,以下两个函数依赖关系适用:

sentenceIDFromTree->sentenceIDFromToken

sentenceIDFromToken->sentenceIDFromTree

因为这两种依赖关系的右侧都不对应于左侧的子集,即它们不是微不足道的;它们的左侧也不对应于超键,即关系模式不在BCNF中。为了使关系模式在BCNF中,我认为我可以将sentenceIDFromTree和sentenceIDFromToken合并到一个属性中;毕竟,这两个属性始终需要具有相同的值。据我所知,在SQL中,我无法使一个外键同时直接引用多个表,因此我可能必须使用一些额外的触发器来确保syntaxTree和令牌表都被单个sentenceID引用。 由于我在数据库设计方面没有太多经验,并且不知道什么是“良好的数据库设计”,我现在想知道我是否真的应该合并这两个外键,或者让我的设计保持原样,或者可能有更多的方法来处理这个问题?。此外,我担心整个问题可能表明我的概念设计确实有问题,但我不知道如何以不同的方式对该场景进行建模。任何帮助都将不胜感激。

您写道:

在SQL中,我不能使一个外键同时直接引用多个表

这里有一些不精确的地方,这是你问题的根源。外键只能引用一个表。但是,单个表列可以是一个或多个外键的一部分

因此,正确的设计是:

terminalNode中只有一个sentenceID列 有两个外键,都包括sentenceID
这种重叠确保了两个父项之间的关系正确。

是否有terminalNodesentenceId、treeDiscr->syntaxTree和terminalNodesentenceId、tokenDiscr->token?或者是sentenceIDFromToken和sentenceIDFromTree可能有所不同?如果是,为什么?不,sentenceIDFromToken和sentenceIDFromTree必须始终保持相同的值;i、 e.终端节点只能与相应语法树关联的句子中的标记关联。这就是为什么我想到将这些属性合并为一个属性的原因。这听起来不错。在两个关系之间共享同一列应该没有问题;只要它只有一列。当然,可能存在一个ConstraintSetContencedFromTree=sentenceIDFromToken,但这可以通过sentenceId参与两个FK关系来消除。谢谢,我显然已经开始混淆列和外键,它们可能是我脑海中的一部分。