可选的多对多关系的域模型

时间:2010-05-03 19:39:54

标签: oop many-to-many

假设我正在建模电话号码。我有一个PhoneNumber实体,一个Person实体。有一个链接表,用于表示PhoneNumberPerson之间的链接(如果有)。链接表还有DisplayOrder的字段。

访问我的域模型时,我有几个用例来查看Person

  1. 我可以在没有任何PhoneNumber信息的情况下查看它们。
  2. 我可以看一下特定的PhoneNumber
  3. 我可以查看它们及其所有当前(或过去)PhoneNumbers
  4. 我正在尝试为Person建模,不仅针对标准CRUD操作,还针对PhoneNumbersPerson的(非)分配。我无法表达两者之间的关系,尤其是对DisplayOrder属性的尊重。我可以想到几个解决方案,但我不确定哪个(如果有的话)最好。

    1. 具有PhoneNumberPersonPerson属性的PhoneNumber类(最类似于数据库设计)
    2. 继承自PhoneCarryingPersonPerson的{​​{1}}类 属性。
    3. PhoneNumber上的PhoneNumber和/或PhoneNumbers属性(反之亦然,Person上的Person属性)
    4. 从域模型的角度来看,建立这种模型的好方法是什么?如何避免错放的属性(PhoneNumber上的DisplayOrder)或有条件填充的属性?

3 个答案:

答案 0 :(得分:3)

选项1具有最大优势,因为这是多对多的关系。每个人都有一个PhoneNumberPerson对象列表,每个电话号码都有一个PhoneNumberPerson objetcs列表,可以有效地创建两个一对多的关系。

从长远来看,管理这两个一对多关系将会更容易。

没有电话的人将成为其PhoneNumberPerson列表为空的人。继承选项看起来很难维护。

此外,PhoneNumberPerson课程可以携带该人开始使用手机并停止使用手机的日期等信息,以便很容易判断它是否是当前手机。

答案 1 :(得分:1)

  

对此进行建模的好方法是什么   从域模型中有意义   透视?

由于其简单性,您的第三个选项听起来最好:

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

如何避免错位   属性(人物上的DisplayOrder)   或有条件居住的房产?

DisplayOrder是否具有任意性,或者是否嵌入了某些域名含义,例如它被新电话号码取代的日期?如果是这样,我会更改属性,以便表达该含义。也就是说,不要将显示顺序存储在数据库中,存储构建正确显示顺序所需的信息,并让您的视图对它们进行排序,可能使用域模型中定义的策略。 (例如,StandardDisplayOrderStrategy可能会显示1)家庭号码,2)工作号码,然后3)手机号码。)

对于有条件填充的属性,请考虑始终将它们全部填充。

答案 2 :(得分:1)

Join-Table 设为一个单独的类,例如的 PersonalPhoneNumber

  • PersonalPhoneNumber有两个字段:One Person和一个PhoneNumber
  • Person有一个 PersonalPhoneNumber 的列表(java.util.List)
  • 列表的排序是您想要表达为DisplayOrder
  • PhoneNumber还可以拥有一组人员