2017-07-18 83 views
2

我正在建模一個數據庫,其中有兩個交叉關係。模型似乎沒問題,但我不知道如何將其轉換爲關係模型,因爲會有兩個關係參考遞歸地(如果這是正確的詞)。實體之間具有一對多交叉關係的實體關係模型。這是錯的嗎?

Entity-relationship model(我消除的屬性,因爲它們不提供有用的信息)

這是它的型號:A爲能生出N次,並在同一時間,在單胎多衆生本來是誕生了。

我知道在一個關係模型中,一個關係必須在另一個可以引用它之前被定義,所以我不知道如何解決這個問題。

編輯:由於正確指出我的模型沒有太大的意義sqlvogel。因爲它是實際的出生在出生方面的基數應該是0..1,因此存儲「沒有父母」的第一層生命是允許的。這也應該解決可延遲約束的問題,即使它不是最優雅的方式。

+0

定義是遞歸的,當它的部分定義彼此或它們自己時。這裏我們只有兩個同時約束。 (FK,稱爲關係,但不是)。它們是指對方的表格。但是沒有相互/自我的定義。例如,如果我說,表T&U必須相等,你不會稱這是一個約束的遞歸定義,它不是一個值的定義,即使你不能改變一個沒有改變另一個。 – philipxy

回答

2

這種遞歸設計沒有任何固有的錯誤。在你的具體例子中,如果你的意圖是模擬親子關係那麼它似乎沒有實際意義,因爲(除非一個「存在」生出自己),它肯定需要在你的數據庫中有無數的出生和存在。另一方面,你的描述表明你實際上只是建模出生而不是親子關係,在這種情況下,你的模型可能是合理的。

某些DBMS允許您一次創建完整模式,因此您不一定必須在另一個之前創建一個關係。否則,應該可以創建沒有參照約束的關係,然後添加約束。

如果您正在使用SQL DBMS,那麼當您使用您創建的表時可能會出現另一個潛在問題。在標準SQL中,一次只能插入數據或更新數據表。填充兩個相互依賴的表的標準方法是使用稱爲「可延遲約束」的功能,這意味着約束在事務提交時而不是在語句邊界處進行評估。並非所有DBMS都支持可延遲約束功能,許多數據庫設計人員更願意避免這種情況。