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

时间:2013-06-18 23:04:29

标签: sql database database-design foreign-keys database-normalization

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

总的来说,在将我的ER图转换为关系模式之后,我的一些关系模式看起来像这样(简化):

  

句(sentenceID)

     

syntaxTree(sentenceID,treeDiscr)

     

令牌(sentenceID,tokenDiscr)

     

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

如您所见,terminalNode的关系模式包含两个外键,每个外键引用一个句子ID:一个保存语法树所代表的句子的ID,一个保存该标记所属的句子的ID。当然,这些sentenceID的值总是必须相同。因此,对于terminalNode,以下两个功能依赖包含:

  

sentenceIDFromTree - > sentenceIDFromToken

     

sentenceIDFromToken-> sentenceIDFromTree

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

1 个答案:

答案 0 :(得分:0)

您写道:

  SQL中的

我不能直接使一个外键引用几个表

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

因此,正确的设计是:

  • sentenceID
  • 中只有一个terminalNode
  • 有两个外键,两者都包含sentenceID

这种重叠确保了两个父母彼此之间的关系正确。