【发布时间】:2013-02-06 14:12:56
【问题描述】:
我正在开发一个旅行管理应用程序。有问题的设计如下所示:
旅行中的每个人都被指定为旅行者。 每个旅行者都有一本护照。 现在,Traveler 可以是 MainMember 或 SubMember,这取决于他是否是一家之主。 MainMember 决定诸如 TourPackage 之类的东西,他的旅行家庭的总金额等。 SubMember 在旅行时依赖于 MainMember。因此,如果 MainMember 被删除,它的所有 SubMember 也必须被删除。
所以, 旅行者有护照。 (一对一关系) Traveler 是 MainMember 或 SubMember。 (Traveler-MainMember 和 Traveler-SubMember 之间的一对零/一对) 一个 MainMember 可能有多个 SubMember。 (一对多) 一个 SubMember 只有一个 MainMember。 (多对一)
我目前的 ERD 如下所示。
如您所见,三个表 - Traveler、MainMember 和 SubMember - 形成了循环依赖关系。不过,我不确定这是否会损害我的申请。 如果我删除了一个作为 MainMember 的 Traveler,那么 1. Traveler中的一条记录被删除。 2、删除其相关的MainMember记录。 3、删除依赖于MainMember的SubMember记录。 4. 删除子会员的旅行者记录。
虽然这似乎不是问题,但作为 Traveler-MainMember 删除将始终只删除 Traveler-SubMember。不过,我对此有一种不好的预感。
谁能指导我做出更好的设计?
更新 -
在等待回复时,我根据@Daveo 的回复想出了另一个设计。基本上,Traveler 包含自引用外键。 SubMember 记录将使用它来识别他们的父母。
这是 ERD。
现在,正如@Branko 所指出的,我之前的设计中没有循环依赖的问题,我想知道哪种设计更好?
另外,哪种设计更适合通过 Hibernate 实现?我认为第二种方法在通过 Hibernate 实现时可能会导致复杂性。
对于您喜欢的设计,我还希望能提供一些关于实现模式(Hibernate 实体中的继承等)的建议。
【问题讨论】:
-
对 MainMember 和 SubMember 使用继承(扩展 Traveler)
-
@guido - 这确实是我实现 POJO 实体时的想法。但是,这如何解决数据库设计中的循环依赖?或者我误解了你的说法。如果您详细说明它作为答案,我将不胜感激。
-
关于第二个设计:如果您要为 main 和 sub-traveler 设置单独的表,为什么不利用它并正确建模他们之间的关系,所以不能连接两个 sub 或两个 main 旅行者?从
Traveller到Traveller的循环引用(这次是真实的;))不遵守这些限制。我认为@Daveo 的想法是将所有 3 个旅行者表合并为一个,这将是实现继承的“同一张表中的所有类”方法,是的,会导致很多 NULL,但也可能有一些优势(请参阅链接在我的回答中)。 -
“但效率很低的方法” - 在某些情况下效率较低,而在其他情况下实际上效率更高。无论哪种方式,您都会有妥协,唯一的问题是您认为在您的特定情况下更好的权衡。就个人而言,我建议您坚持原来的方法,除非您确定不这样做的具体原因。
标签: database-design hibernate-mapping circular-dependency erd class-table-inheritance