Doctrine中有单表继承(STI)和类表继承(CTI)的“general performance consideration”:
如果多对一或一对一关联的目标实体是STI / CTI实体,则出于性能原因,它最好是继承层次结构中的叶实体(即具有没有子类)。否则,Doctrine不能创建该实体的代理实例,并且总是急切地加载该实体。
a SO answer中的@timdev非常清楚地说明了这个问题:
abstract class Pet { ... }
class Cat extends Pet { ... }
class Dog extends Pet { ... }
class Collar {
/** @Column(length="16") */
protected $color;
/** ManyToOne(targetEntity="Pet")*/
protected $owner;
}
现在,如果你想迭代所有的蓝色项圈,Doctrine会遇到麻烦。它不知道$ owner所属的类,因此它不能使用代理。相反,它被迫急切地加载$ owner来查明它是猫还是狗。
好的,所以我的问题是:如果我做需要迭代我的应用中的蓝色项圈(例如,因为我希望它们列在网页中)。
解决性能问题的建议解决方案是什么?我应该切换到ManyToMany关联,即使它没有多大意义,或重新考虑我的数据建模?