我想爲我的數據庫中的語言語法樹建模。在我的設計中,語法樹由內部節點和終端節點組成;兩種類型的節點都是由它們所屬的語法樹標識的弱實體類型。語法樹本身也是弱實體;它們由它們將要表示的句子結構的句子來識別。給定的句子可能有多個語法樹。 終端節點可以與來自其語法樹所標識的句子中的令牌相關聯(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。 因爲我沒有太多的數據庫設計經驗,並且不知道什麼被認爲是「好的數據庫設計」,我現在想知道我是否應該真的合併這兩個外鍵,或者將我的設計保持原樣(或者可能存在進一步的方法來處理這個?)。此外,我擔心整個問題可能表明我的概念設計存在某些錯誤,但我不知道如何以不同的方式對這種情況進行建模。任何幫助將不勝感激。
Have terminalNode(sentenceId,treeDiscr) - > syntaxTree和terminalNode(sentenceId,tokenDiscr) - > token?或者是否是句子IDFromToken和sentenceIDFromTree可以不同? (並且,如果是這樣,爲什麼?) – user2246674
否,sentenceIDFromToken和sentenceIDFromTree總是必須保持相同的值;即,終端節點只能與來自相應語法樹所關聯的句子的令牌相關聯。這就是爲什麼我想出了將這些屬性合併爲一個的想法。 – user2498957
這聽起來不錯。在兩個關係之間共享同一列不應該有問題;只要它只有一列。當然,可能存在一個約束(sentenceIDFromTree = sentenceIDFromToken),但是可以通過sentenceId參與兩個FK關係來消除。 – user2246674