1

我想为我的数据库中的语言语法树建模。在我的设计中,语法树由内部节点和终端节点组成;两种类型的节点都是由它们所属的语法树标识的弱实体类型。语法树本身也是弱实体;它们由它们将要表示的句子结构的句子来识别。给定的句子可能有多个语法树。 终端节点可以与来自其语法树所标识的句子中的令牌相关联(1:m关系)。令牌也是由它们所属的句子识别的弱实体。ER图中的周期:糟糕的设计? BCNF?

所以,总体来说,翻译我的ER图转换成关系后的模式我的一些关系模式看起来像这样(简化):

句子(sentenceID)

syntaxTree(sentenceID,treeDiscr)

token(sentenceID,tokenDiscr)

terminalNode(sentenceIDFromTree,treeDiscr,nodeID,sentenceIDFromToken,tokenDiscr)

正如您所看到的,terminalNode的关系模式包含两个外键,每个外键引用一个句子ID:一个保存语法树表示的句子的ID,一个保存该令牌所属句子的ID。当然,这些句子ID的值始终需要相同。因此,对于terminalNode以下两个函数依赖持有:

sentenceIDFromTree - > sentenceIDFromToken

sentenceIDFromToken-> sentenceIDFromTree

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

+0

Have terminalNode(sentenceId,treeDiscr) - > syntaxTree和terminalNode(sentenceId,tokenDiscr) - > token?或者是否是句子IDFromToken和sentenceIDFromTree可以不同? (并且,如果是这样,为什么?) – user2246674

+0

否,sentenceIDFromToken和sentenceIDFromTree总是必须保持相同的值;即,终端节点只能与来自相应语法树所关联的句子的令牌相关联。这就是为什么我想出了将这些属性合并为一个的想法。 – user2498957

+0

这听起来不错。在两个关系之间共享同一列不应该有问题;只要它只有一列。当然,可能存在一个约束(sentenceIDFromTree = sentenceIDFromToken),但是可以通过sentenceId参与两个FK关系来消除。 – user2246674

回答

0

您写道:

在SQL我不能在同一时间直接

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

因此,正确的设计是:

  • 仅在terminalNode
  • 具有两个外键,这两者包括sentenceID

这种重叠可确保有一个sentenceID列,这两个父母彼此之间是正确的。

+0

谢谢,我显然已经开始混淆列和他们可以成为我脑海中的一部分的外键。 – user2498957