2009-01-12 58 views
1

我正在使用一個ORM(SQLAlchemy,但我的問題是相當實現不可知的)來建模一個父類和它的孩子之間的多對多關係..我想知道,什麼是一種簡單的方式來表達「其中一個孩子是默認/主要的」這個概念?你將如何建模一個ORM的「默認子」標誌?

例如,我需要堅持以下幾點:
這個人實例已地址X和Y,最主要的是Y.

我看到這個使用像「PersonAddressRelation「中」類實現「這將包含」人「,」地址「和」主「旗,但我認爲它看起來有點麻煩..有沒有更好的方法?

回答

2

最簡單的方法是在Person表上有一個連接表,PersonAddressRelation和一個DefaultAddress列,這個列是Address表的鍵。

+0

所以連接表由ORM處理,而我處理只是DefaultAddress,我看到..謝謝! – Joril 2009-01-12 14:11:28

1

幾句話。

  • M:N的關係不指定「父」和「兒童」,因爲沒有父也不是子:有簡單地具有一個m兩個實體:N經由第三實體關係(中間實體)。

  • '地址'通常不是有效的實體類型,因爲它在語義上沒有標識,類似於'名稱'沒有標識(名字,姓氏)。當您重新使用Address類型的實體實例時,您會看到這一點:您不會那麼做。 (例如,當客戶有多個訂單時,您將重新使用客戶實體實例)

  • 您想在M:N關係中指定一個屬性(默認值),因爲它屬於那個屬性。這意味着關係本身形成一個實體(這是一箇中間實體,通常它只有兩個形成PK的FK字段)。這被稱爲「客體關係」,因爲關係本身被視爲一個實體。其他示例是員工m:n部門,並且您想指定員工爲員工工作的部門啓動的員工的StartDate。

所以一般來說:創建中間實體,因爲它通常應該在那裏,並在那裏添加屬性。在Address的這個特殊情況下,確保你在相關實體(Person)中重新使用Address實例。如果沒有,將地址與Person或者合併,如果一個人可以有多個地址,在Person - Address之間建立一個簡單的1:n關係來規範化它,儘管不要害怕將地址數據合併到它所關聯的實體中,因爲地址數據經常不被重用(所以你的m:n關係真的不存在:沒有與多個人實例相關的Address實例)

+0

我用錯誤的術語「父母」和「孩子」,感謝您的更正:)至於「地址」的問題,我選擇了錯誤的例子,對不起:/ Anyway你的解釋非常全面,謝謝! – Joril 2009-01-12 14:27:09