我有三个实体“可寻址”(可以有地址):
投放点
的客户
投放中心
每个可寻址实体也是 Geolocatable (具有纬度和经度),但我有 Geolocatable 但不是可寻址的实体,例如跟踪点和路线点(lat和lng的有序序列)。
使用doctrine 2(使用Symfony2和YAML映射)来实现这一目标的最佳方式是什么(请考虑性能,因为有些表可能有数百万行)?
我的问题是:这个问题的最佳方法是什么?映射的超级课程?单表继承?多表继承?通过阅读学说的文档,我没有得到最好的。
我正在使用PostgreSQL,如果重要的话。
答案 0 :(得分:3)
这绝对是一种组合比继承更合适的情况。
您用来描述问题的语言很有启发性。您将“可寻址”定义为“可以拥有和地址,这与”客户是地址的类型不同。“在后一种情况下,继承会更有意义
零级只是使用关联(Address OneToOne Geolocation,Customer OneToOne Address,RoutePoint OneToOne Geolocation)等。
如果要对任何具有Address的操作执行一组操作,请创建一个名为Addressable的接口,让客户实现它。
如果您运行的是PHP 5.4,则可以使用特征来干扰实现这些接口。
答案 1 :(得分:1)
最快的选择是根本不使用任何表继承并将所有实体映射到不同的表但是如果由于某种原因想要使用表继承...
单表继承由于体系结构更快,因为查询中的连接较少...请参阅this article以了解表继承的工作原理/外观...
元数据通常是缓存的,因此在使用映射超类或为每个实体提供完整的映射(对DRY来说都不好)之间不会产生明显的性能影响。
真正的性能提升将来自优化您的查询并缓存这些及其结果。