2010-02-20 98 views
1

我有兩個類ParentChildJava中的父類和子類應該有2個數據表?

class Child extends Parent { 
    private String extraField1; 
    private String extraField2; 
    ... 
} 

Child類有2名額外的字段extraField1extraField2

Q1。我應該做兩個差異。數據庫中的表格:一個用於Child,另一個用於Parent

Q1。我應該在Parent表中添加兩列(每列添加一個額外字段)並將Child存儲在Parent表中。

=============================== EDITED ============== =========================

是的,ChildParent是同一層次中的類。

+0

你能解釋一下你想要實現什麼?那些'extraField1/2'是什麼?基本上在很多情況下,'Parent'和'Child'是同一件事 - 它們是某些層次結構的某些元素。 – Crozin 2010-02-20 10:34:29

+0

我不明白你的基本概念。爲什麼孩子*延長父母?這不是處理1:n關係的正常方式,除非Java與我所知的OOP語言不同。 – 2010-02-20 10:34:33

+0

無論如何,正如我在其他問題中所說的,我認爲你肯定需要兩張桌子。 – 2010-02-20 10:43:41

回答

10

在Java中,父類和子類是否應該有2個數據表?

這個問題沒有普遍的答案。實際上有幾種將繼承層次映射到關係數據庫的技術,它們都有優點和缺點。選擇一個或另一個取決於你的上下文。

斯科特·安布勒詳細介紹了他的著名論文Mapping Objects to Relational Databases: O/R Mapping In Detail的部分2. Mapping Inheritance Structures說我引用下面的各種方法:

(...)在本節 你會看到有 3用於將 繼承映射到關係數據庫的主要解決方案,以及超越繼承 映射的第四個補充 技術。這些方法包括:

對於一個全面的比較(與優點,缺點以及何時使用的建議),有看一下2.6 Comparing The Strategies這個部分。

我不能比他做得更好,所以在解釋他時沒有意義,只需參考原文。

+0

@Pascal與往常一樣,你也幫助我這次...感謝那... – 2010-02-22 17:59:09

+0

@Yatendra不客氣。很高興你發現這個答案很有用(上述文章實際上是必讀的)。 – 2010-02-22 18:26:28

0

Patterns of Enterprice Application Architecture涵蓋此以及在其章節Single-table inheritance,Class-table inheritanceConcrete-table inheritance

覆蓋範圍與Pascal所說的相似。沒有一個真正的方法,但這本書確實給你一個成本和收益的細分,例如

混凝土表繼承的優勢是:

  • 每個表是自包含的,沒有不相關的領域。結果 當其他 未使用 對象的應用程序使用它時很有意義。
  • 當從具體的 映射器讀取數據時,沒有連接要做。
  • 只有在訪問該類時纔會訪問每個表,這可以使 傳播訪問負載。

混凝土表繼承的缺點是:

  • 主鍵可以是難以處理。
  • 您不能強制數據庫關係抽象類。
  • 如果域類中的字段被向上或向下推送到層次結構中,則必須更改 表的定義。你不必像 那樣做很多的改變,如類表 繼承(285),但你不能 忽略這一點,因爲你可以用單一的 表繼承(278)。
  • 如果超類字段發生更改,則需要更改每個具有此字段的表 ,因爲超類 字段在 表之間重複。
  • 查找超類迫使您檢查所有表,這導致 到多個數據庫訪問(或 奇怪的聯接)。
相關問題