在做一些映射一对一关系的研究时,我遇到了一些让我质疑我的一些数据库设计决策的陈述。NHibnerate数据设计建议
基本上我有类似以下一些实体:
人联系,家长
两个触点和父母都是人。 一个人可能是联系人,父母,两者都不是。
我想出的数据库设计为这三个实体中的每一个都有一个表,并且所有三个表共享一个主ID(PersonID)。从数据库设计的角度来看,这似乎是一种很好的规范化和合理的表现方式来表示数据库及其关系(至少对我而言)。
此时,我开始编码C#类和NHibnerate映射来表示这些实体。我能找到的最自然的映射方法是使用映射。其他选项(一对一,一对多等)似乎要求我在表中添加一个或多个不必要的FK。在通过NHibernate的文档浏览我偶然发现了如下声明:
此功能常常对遗留数据模型有用,我们推荐比类和细粒度的领域模型表少。但是,如稍后所解释的,在单个层次结构中的继承映射策略之间进行切换非常有用。
我的问题是:
A)我是不是违反本校长? B)如果是这样,我会如何更好地设计这个系统?
这段陈述是否暗示我应该将所有Person/Contact/Parent字段合并到一个表中(带有许多可为空的字段)?或者我不知何故错过了这一点?
由于这是一个罕见的场合,我可以从头开始设计表格/类,所以我想说得对。先谢谢您的帮助!
编辑:我是如何打算的上述数据库设计更多信息工作:
的基本思路是,每个人得到的人表中的记录。相关表中记录的存在/不存在决定了这个人是否是家长,联系人等......这似乎强制执行一对多关系并允许快速查询/连接(共享主ID是在每个表中聚集PK)。
编辑:谢谢你们的帮助。当我设计这个系统时,我并没有真正考虑到查询能力,所以我将转向类似于Jamie Ide & hlgem建议的解决方案。我发现所有的答案有帮助。总而言之,共享主键看起来会导致c#端的对象模型出现一些问题。
谢谢你的建议。我同意这会解决我的映射问题。但是,我认为这使得数据库设计方面“更丑陋”。由于所有这些关系都应该是一对一的(也许我应该在第一篇文章中明确说明),您的建议似乎会在模型中引入大量不必要的FK。除此之外,它使关系成为一个>多个而不是一个>一个 - 最初的设计会强制执行正确的基数。 – Krazzy 2010-01-25 19:23:53
@Krazzy:说实话,在不了解表格范围的情况下建议设计有点困难;因为我不知道Person,Parent和Contact有多少列,所以很难说出什么是好的设计。根据您的反馈,也许您最好将Parent和Contact表与Person表合并,并根据需要使用View来恢复父级和联系人? (这基本上是我原来的建议的反面...) – 2010-01-25 20:39:43
@Krayzzy:无论如何,基本问题是共享主键。一个很好的通用规则(以及Hibernate广泛使用的规则)是为每个表都有一个不同的主键。 – 2010-01-25 20:41:04