2010-05-03 44 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
  • ******中国也可以有一组人的