我有四种类型的产品,我想在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
类的基本类结构来创建相应的bundle映射的结构,所以我想我需要这个作为映射的超类。
在我看来,可行的方法是有两个单独的表,一个用于PostpaidProduct
,一个用于PrepaidProduct
,并且对MobilePostpaidProduct
/ {的表有一个单表继承{1}}和PostpaidProduct
/ MobilePrepaidProduct
。
你们觉得怎么样?有关最佳模拟方法的想法吗?
答案 0 :(得分:0)
如果您正在使用RDBMS层[MySQL,Postgre],我认为您的提案是最佳选择。
如果子类有* 很少更多的属性,可能是关系,那么你实际上是在促进组合,你的数据表示不会稀疏[即你不会在主表中有很多空字段。
另一方面,如果你只想坚持使用作文[在大多数情况下更为明智] - $device
是移动课程中唯一的附加关系吗?如果是这样,您可以在您的存储库类中编写一个findAllMobileProducts
方法,该方法将返回设备不为null的每个产品,依此类推。