4

我有四种类型的产品,我想将它们映射到 MySQL RDBMS 上的 Doctrine ORM 结构。产品是PrepaidProduct, PostpaidProduct, MobilePrepaidProduct,MobilePostpaidProduct结构如下:

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来创建相应的捆绑映射的结构,所以我认为我需要这个作为映射的超类。

在我看来,要走的路是有两个单独的表,一个 forPostpaidProduct和一个 for PrepaidProduct,并在那些 for MobilePostpaidProduct/PostpaidProductMobilePrepaidProduct/上有一个单表继承PrepaidProduct

你们有什么感想?关于最好的建模方法有什么想法吗?

4

1 回答 1

0

如果您使用 RDBMS 层 [MySQL, Postgre],我认为您的建议是最佳选择。

如果子类有更多的属性,最重要的可能是关系,你实际上是在促进组合,你的数据表示不会是稀疏的[即你在主表中不会有很多空字段]。

另一方面,如果您只想坚持作文[在大多数情况下更可取]-是$device移动课程中唯一的附加关系吗?如果是这样,您可以在存储库类中编写一个findAllMobileProducts方法,该方法将返回设备不为空的每个产品,依此类推。

于 2012-09-27T11:16:07.810 回答