2012-09-27 81 views
4

我有四種類型的產品,我想映射到MySQL RDBMS上的Doctrine ORM結構。該產品是PrepaidProductPostpaidProductMobilePrepaidProductMobilePostpaidProduct結構如下:主義多級繼承映射

abstract class Product { 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    private $price; 

    ... 
} 

class PrepaidProduct extends Product { 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    private $credit; 

    /** 
    * @ORM\OneToMany(targetEntity="PrepaidDiscount") 
    */ 
    private $prepaidDiscounts; 
} 

class PostpaidProduct extends Product { 
    /** 
    * @ORM\OneToMany(targetEntity="BundleMapping") 
    */ 
    private $bundleMappings; 
} 

class MobilePrepaidProduct extends PrepaidProduct { 
    /** 
    * @ORM\ManyToOne(targetEntity="Device") 
    */ 
    private $device; 
} 

class MobilePostpaidProduct extends PostpaidProduct { 
    /** 
    * @ORM\ManyToOne(targetEntity="Device") 
    */ 
    private $device; 
} 

主要的想法是,我想用將使用PostpaidProduct類的基本類結構,以創建服務(廠)一個相應的bundle映射的結構,所以我想我會需要這個作爲映射的超類。

在我看來去將有兩個單獨的表,一個用於PostpaidProduct,一個用於PrepaidProduct,並且對那些MobilePostpaidProduct/PostpaidProductMobilePrepaidProduct/PrepaidProduct一個單表繼承的方式。

你們認爲什麼?任何想法最好的方式來建模?

回答

0

如果您正在使用RDBMS圖層[MySQL,Postgre],我認爲您的提議是最佳選擇。

如果子類有* 更多的屬性,可能的關係最重要的是,你實際上是促進組合,你的數據表示不會稀疏[即你將不會在主表中有許多空的字段]。

另一方面,如果你想堅持只有作文[這在大多數情況下更可取] - 是$device移動類中唯一的附加關係?如果是這樣,您可以在存儲庫類中編寫一個findAllMobileProducts方法,該方法將返回設備不爲空的每個產品,等等。