2010-05-03 46 views
1

假設我正在爲電話號碼建模。我有一個爲PhoneNumber的實體,另一個爲Person。有一個鏈接表表示PhoneNumberPerson之間的鏈接(如果有的話)。鏈接表也有一個DisplayOrder的字段。可選多對多關係的域模型

當訪問我的域模型時,我有幾個用例來查看Person

  1. 我可以看看他們沒有任何PhoneNumber信息。
  2. 我可以看看他們的具體PhoneNumber
  3. 我可以看看他們和他們所有的當前(或過去)PhoneNumbers

我試圖模擬Person,不僅爲標準的CRUD操作,但對於PhoneNumbers的(UN)分配到Person。我無法表達兩者之間的關係,特別是對於DisplayOrder財產的尊重。我可以想到幾個解決方案,但我不確定哪個(如果有的話)是最好的。

  1. 具有PersonPhoneNumber屬性的PhoneNumberPerson類(最接近數據庫設計)
  2. 一個PhoneCarryingPerson類,從Person繼承和擁有PhoneNumber 屬性。
  3. 一個PhoneNumber和/或PhoneNumbers財產上Person(和VIS-A-反之亦然,一個Person財產上PhoneNumber

什麼是模型這是有道理的,從一個域模型視角的好辦法?如何避免錯位的屬性( Person)或有條件填充的屬性?

回答

3

選項1具有最大的優勢,因爲這是一個多對多的關係。每個人將有一個PhoneNumberPerson對象列表,每個電話號碼將有一個PhoneNumberPerson對象列表,有效地創建兩個一對多關係。

從長遠來看,管理兩個一對多的關係將會更容易。

沒有電話的人將成爲PhoneNumberPerson列表爲空的人。繼承選項看起來很難維護。

此外PhoneNumberPerson類可以攜帶信息,如人開始使用手機的日期,並停止使用手機,以便很容易判斷手機是否是當前手機。

+2

+1 - 建模連接Person和PhoneNumber作爲實體本身的Edge是最有意義的,因爲它允許您隨時向該Edge添加額外信息。 – 2010-05-03 20:00:31

+0

什麼樣的信息可以更有意義地生活在邊緣,可以說,而不是由那個邊緣加入的實體之一? – 2010-05-03 20:05:02

+0

我開始實現這一點,我發現時間片是問題更多的部分。我必須通過一個約會找到電話號碼,但在那個時候,這個人不再是一個人,而是一個歷史人物。這有點奇怪,但有效。 – Greg 2010-05-03 20:23:52

1

什麼是這個 有意義從一個域模型 視角模式的好辦法?

你的第三個選項的聲音最好的,憑藉其簡單的:

Person.PhoneNumbers // a list of phone numbers 
PhoneNumber.Person // references its parent 

如何避免錯位的 特性(在人DisplayOrder) 或有條件填充屬性?

DisplayOrder是否是任意的,或者是否存在嵌入其中的某個域含義,例如它被新電話號碼替換的日期?如果是這樣,我會改變屬性,以表達它的含義。也就是說,不要將顯示順序存儲在數據庫中,存儲構建正確顯示順序所需的信息,並讓您的視圖對它們進行排序,或許使用在您的域模型中定義的策略。 (例如,StandardDisplayOrderStrategy可能會顯示1)家庭號碼,2)工作號碼,然後3)手機號碼。)

至於有條件填充的屬性,請考慮隨時填寫它們全部。

+0

關於DisplayOrder。想象一下你看到一個聯繫人(人)的手機。用戶可能想重新排列該人員電話號碼的列表。 DisplayOrder會存儲該值。 *這個問題不是關於電話號碼,所以如果這個比喻在那裏開始崩潰,我很抱歉。責備NDA。 :(* – Greg 2010-05-03 20:12:04

+0

Aha,抨擊NDA!如果顯示順序屬性在域中捕獲了可理解的含義,我只是將其包含在實體中 - 但也許很難在這裏看到隱祕的面紗;) – 2010-05-03 20:21:44

1

使加入表爲單獨的類,例如, PersonalPhoneNumber

  • PersonalPhoneNumber有兩個領域:一個人,一個******中國
  • 人都有一個列表(java.util.List的)PersonalPhoneNumber小號
  • 列表的順序是什麼你想表達的DisplayOrder
  • ******中國也可以有一組人的