如何将对象继承映射到数据模型?

如何将对象继承映射到数据模型?

问题描述:

我有一个抽象基类和5-6类继承该基类的对象模型。我想设计一个适当的关系数据模型来存储它们。设计数据模型的最佳方式是什么?如何将对象继承映射到数据模型?

这里是为要保持已发送邮件的跟踪一个虚构的应用一个简单的例子:

消息(基类)

  • 长期ID
  • 日期creationDate
  • 字符串文本

EmailMessage(延伸消息)

  • 字符串recipientList

PhoneMessage(延伸消息)

  • 字符串phoneNumber的

我倾向于创建一个单独的表每个班级都在哪里bles email_message and phone_message只包含他们的私人领域。它的美妙之处在于它反映了对象模型并保持关注的清晰分离。坏处是数据将不得不被加载两次:一次用于确定具体类型,另一次用于加载具体表中的剩余数据。

我觉得这是一个非常普遍的问题,我还没有找到满意的答案。我会很感激你的任何建议。你有什么经验?谢谢。

皮特

有很多种方法可以做到这一点,而选择由您决定。常见的解决方案是单表继承(STI),多表继承(MTI),也称为类表继承(CTI)和具体表继承。

使用STI,父类的所有子类的所有列都在单个表中定义。不使用某些列的类将它们的值存储为NULL。类的类型通常存储在附加列中。

随着MTI,所有超列存储在一个单一的父表,而每个子类单独的表来保存其独特的领域。子类表上的外键链接回父记录。

混凝土表继承采取了这一进一步,并需要为每个子类完全分开的表。

有很多文章促进各种方法 - STI通常是最简单的实现,而MTI/CTI可避免固有的STI某些问题(要求为空的领域是很常见的)。

+0

+1。 MS EF团队做了一个体面的[一系列博客文章](http://weblogs.asp。net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx)。 – 2013-02-11 22:50:13

+0

感谢您的回复。它帮助我找到其他来源。 OOP和rel之间的冲突。数据库也被称为**阻抗不匹配**,如果有人想为它谷歌。 我仍然很想知道人们使用不同方法的经验。所以请随时继续发帖。谢谢。 – Jules 2013-02-12 17:42:40