首先,从数据库(即mysql )构建类不是一个问题,它更多地是一个关于性能的问题。
如果我有一个A班,这取决于B班。
class A
{
protected $depend;
public function __construct($id == null)
{
// construct from mysql/postgresql/...
}
}在数据库中有A类(如表"tbl_A")、B类表的外键(如"tbl_B")。当然,这个类依赖于多个表,但我将在这里简化.
现在,我从它的表中构造A类:
select * from tbl_A where ID = $id如果他们成功的话,A类的陈述会给我这样的感觉:
ID | Name | B_ID
1 | "test" | 3之后,我不得不在它的构造函数中构造B类。是否有可能只在A类的构造函数中使用一个join语句,然后从那里构造B类?我认为这将提高我的应用程序的性能。糟糕的是,我没有发现任何像朋友类(c++,等等)这样的功能,我想让B类的属性保持保护或私有。
发布于 2013-12-06 08:43:43
最大的性能开销是什么: MySQL/PostGre还是PHP端?
如果我正确理解,对于A的一个实例,您必须执行两个查询(一个用于A,一个用于依赖的B)。因此,对于1000个单一实例的A,它使2000查询总数。
您可以优化您的应用程序使用某种“批量加载”。也就是说,同时加载1000个A实例将是对A (1000行)的1个查询+对B (1000行)的1个查询。所以从2000年的查询优化到只有2。
您关于连接表的建议是可能的(在正确的键上加入表A和表B,并选择所有(需要的)字段),但是这将优化从2000到1000个查询再加上对象关系映射代码将变得更加复杂。
发布于 2013-12-06 09:50:51
这将取决于你想去的兔子洞有多深,但是如果你想抓住所有的两个步行者,你可以这样做:
select tA1.* from tbl_A tA1 where tA1.ID = $id UNION select tA3.* from tbl_A tA3 LEFT JOIN tbl_A tA2 ON tA3.ID = tA2.B_ID WHERE tA2.B_ID = $id
但如果你需要深入的话.与执行多个查询相比,这个方法变得越来越复杂,效率也越来越低(特别是因为联合只是让MySQL以这种方式进行查询)。
而且,一旦得到了它们,就应该循环遍历所获得的in列表,并将其保存在数组中,这样就不需要重新加载它们了。
https://stackoverflow.com/questions/20419342
复制相似问题