我想在我的数据库中对语言语法树进行建模。在我的设计中,语法树由内部节点和终端节点组成;这两种类型的节点都是弱实体类型,由它们所属的语法树标识。语法树本身也是弱实体;它们由它们要表示的句法结构的句子来识别。一个给定的句子可能有不止一个语法树。终端节点可以与(1:m-relation)来自其句法树标识的句子中的标记相关联。标记也是由它们所属的句子识别的弱实体。
所以总的来说,在将我的 ER 图翻译成关系模式之后,我的一些关系模式看起来像这样(简化):
句子(sentenceID)
语法树(sentenceID,treeDiscr)
令牌(sentenceID,tokenDiscr)
终端节点(sentenceIDFromTree、treeDiscr、nodeID、sentenceIDFromToken、tokenDiscr)
如您所见,terminalNode 的关系模式包含两个外键,每个外键引用一个 sentenceID:一个保存句法树表示的句子的 ID,一个保存令牌所属的句子的 ID。当然,这些 sentenceID 的值总是需要相同的。因此,对于 terminalNode,以下两个函数依赖成立:
sentenceIDFromTree -> sentenceIDFromToken
sentenceIDFromToken-> sentenceIDFromTree
对于这些依赖项中的任何一个,右侧都不对应于左侧的子集,即它们不是微不足道的;它们的左侧也不对应于超键——即关系模式不在 BCNF 中。为了使关系模式在BCNF中,我认为我可以将sentenceIDFromTree和sentenceIDFromToken合并为一个属性;毕竟,无论如何,这两个属性总是需要具有相同的值。据我了解,在 SQL 中,我不能直接让一个外键同时引用多个表,因此我可能不得不使用一些额外的触发器来确保 syntaxTree 和令牌表都被引用由单个句子ID。由于我在数据库设计方面没有太多经验,并且诚然不知道什么是“好的数据库设计”,我现在想知道我是否应该真正合并这两个外键,或者让我的设计保持原样(或者也许还有其他方法来处理这个问题?)。此外,我担心整个问题可能表明我的概念设计确实有问题,但我不知道如何以不同的方式对这种情况进行建模。任何帮助将不胜感激。