假设我正在建模电话号码。我有一个PhoneNumber
实体,一个Person
实体。有一个链接表,用于表示PhoneNumber
和Person
之间的链接(如果有)。链接表还有DisplayOrder
的字段。
访问我的域模型时,我有几个用例来查看Person
。
PhoneNumber
信息的情况下查看它们。 PhoneNumber
。 PhoneNumbers
。我正在尝试为Person
建模,不仅针对标准CRUD操作,还针对PhoneNumbers
到Person
的(非)分配。我无法表达两者之间的关系,尤其是对DisplayOrder
属性的尊重。我可以想到几个解决方案,但我不确定哪个(如果有的话)最好。
PhoneNumberPerson
和Person
属性的PhoneNumber
类(最类似于数据库设计)PhoneCarryingPerson
且Person
的{{1}}类
属性。 PhoneNumber
上的PhoneNumber
和/或PhoneNumbers
属性(反之亦然,Person
上的Person
属性)从域模型的角度来看,建立这种模型的好方法是什么?如何避免错放的属性(PhoneNumber
上的DisplayOrder
)或有条件填充的属性?
答案 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 强>: