2013-02-11 122 views
1

我有一個抽象基類和5-6類繼承該基類的對象模型。我想設計一個適當的關係數據模型來存儲它們。設計數據模型的最佳方式是什麼?如何將對象繼承映射到數據模型?

這裏是爲要保持已發送郵件的跟蹤一個虛構的應用一個簡單的例子:

消息(基類)

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

EmailMessage(延伸消息)

  • 字符串recipientList

PhoneMessage(延伸消息)

  • 字符串phoneNumber的

我傾向於創建一個單獨的表每個班級都在哪裏bles email_message and phone_message只包含他們的私人領域。它的美妙之處在於它反映了對象模型並保持關注的清晰分離。壞處是數據將不得不被加載兩次:一次用於確定具體類型,另一次用於加載具體表中的剩餘數據。

我覺得這是一個非常普遍的問題,我還沒有找到滿意的答案。我會很感激你的任何建議。你有什麼經驗?謝謝。

皮特

回答

1

有很多種方法可以做到這一點,而選擇由您決定。常見的解決方案是單表繼承(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