我想在我的数据库中建模语言语法树。在我的设计中,语法树由内部节点和终端节点组成;两种类型的节点都是由它们所属的语法树标识的弱实体类型。语法树本身也是弱实体;它们由句子的句法结构来表示。给定的句子可能有多个语法树。 终端节点可以与来自其语句树的句子的标记相关联(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。 由于我对数据库设计没有太多经验,并且不知道什么被认为是“好的数据库设计”,我现在想知道我是否应该真正合并这两个外键,或者保留我的设计(或者可能还有更多)处理这个的方法?)。另外,我担心整个问题可能表明我的概念设计确实存在问题,但我不知道如何以不同的方式对这种情况进行建模。任何帮助将不胜感激。
答案 0 :(得分:0)
您写道:
SQL中的我不能直接使一个外键引用几个表
这里有一些不精确的问题。外键只能引用一个表。但是,单个表列可以是一个或多个外键的一部分。
因此,正确的设计是:
sentenceID
terminalNode
列
sentenceID
这种重叠确保了两个父母彼此之间的关系正确。