PHP / MySQL OOP:从SQL加载复杂对象

前端之家收集整理的这篇文章主要介绍了PHP / MySQL OOP:从SQL加载复杂对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我正在为房地产经纪人做一个项目.我的设计中有以下对象/ MySQL表:
Complexes
Units
Amenities
Pictures
Links
Documents
Events
Agents

这些是上述对象之间的关系.

Complexes have a single Agent.
Complexes have multiple Units,Amenities,Pictures,Links,Documents,and Events.
Units have multiple Pictures,and Documents.

设施,图片,链接,文档和事件都在数据库中具有必要的外键,以指定它们属于哪个单元/复合体.

我需要将必要的对象从数据库加载到PHP中,以便我可以在我的项目中使用它们.

如果我尝试在1个查询中从表中选择所有数据,使用LEFT JOINS,我将获得每个唯一单元的至少(链接数)*(图片数)*(文档数)行.添加设施和活动,我将获得所有*设施*每个复杂的事件#…不确定我想尝试处理加载到PHP中的对象.

另一种可能性是每个复杂/单元,为链接,文档,事件和便利设施执行1个单独的sql语句

我的问题如下:

如果我正确索引所有表格,那么为每个复杂/单位执行3-5个额外查询真的是一个坏主意吗?

如果没有,我怎样才能获得加载到PHP对象中所需的数据.理想情况下,我会为单位设置如下对象:

Unit Object
(
    [id]
    [mls_number]
    [type]
    [retail_price]
    [investor_price]
    [quantity]
    [beds]
    [baths]
    [square_feet]
    [description]
    [featured]
    [year_built]
    [has_garage]
    [stories]
    [other_features]
    [investor_notes]
    [tour_link]
    [complex] => Complex Object
        (
            [id]
            [name]
            [description]
            etc.
        )
    [agent] => Agent Object
        (
            [id]
            [first_name]
            [last_name]
            [email]
            [phone]
            [phone2] 
            etc.

        )
    [pictures] => Array
        (
            [1] => Picture Object
                (
                )
        )
    [links] => Array
        (
            [1] => Link Object
                (
                )
        )
    [documents] => Array
        (
            [1] => Document Object
                (
                )
        )    
)

我不总是需要所有这些信息,有时我只需要复杂的主键,有时我只需要代理的主键等.但我认为正确的方法是加载整个每次我实例化它的对象.

我一直在对OO PHP进行大量研究,但大多数(阅读全部)在线示例仅使用1个表.这显然无济于事,因为我正在研究的项目有很多复杂的关系.有任何想法吗?我在这里完全不合适吗?

谢谢

[UPDATE]

另一方面,通常在每个人都会看到的前端,我将需要所有的信息.例如,当有人想要关于特定复合体的信息时,我需要显示属于该复合体的所有单元,所有图片,复合体的事件以及该单元的所有图片,文档和链接.

我希望避免的是,在一个页面加载期间,执行一个查询以获得我需要的复杂.然后是另一个查询,以获得与该复合体相关联的20个单元.然后对于20个单元中的每个单元,执行图片查询,另一个用于文档,另一个用于链接等.我想一次性获取它们,一次通过数据库.

[编辑2]
另请注意,从数据库中选择图片,事件和代理的查询非常简单.只是基本SELECT [列列表] FROM [table] WHERE [primary_key] = [value]偶尔INNER JOIN.我不做任何复杂的计算或子查询,只是基本的东西.

[BENCHMARK]
所以在阅读了我的问题的所有答案之后,我决定对我决定做的事情进行基准测试.我所做的是加载我需要的所有单位.然后,因为我需要显示图片,等等等等,我当时加载它们.我创建了30,000个测试单元,每个单元有100张图片,100个文档和100个链接.然后我加载了一定数量的单位(我从1000开始,然后是100,然后是更真实的10),循环浏览它们,然后加载与单元相关的所有图片,文档和链接.有1000个单位,大约需要30秒.有100个单位,花了大约3秒钟.有10个单位,花了大约0.5秒.结果存在很多差异.有时,有10个单位,需要0.12秒.然后需要.8.然后也许.5.然后.78.真的到处都是.然而,它似乎平均大约半秒钟.但实际上,我可能一次只需要6个单元,而且它们每个可能只有10个图片,5个链接和5个与之相关的文档…所以我认为“在需要时抓取数据”的方法是在这种情况下最好的选择.如果你需要一次性获取所有这些数据,那么有必要提出一个sql语句来加载你需要的所有数据,这样你只需要循环数据一次(6700个单位一次需要217秒)而全部30,000个PHP使内存不足).

If I properly index all my tables,is it REALLY a bad idea to execute 3-5 extra queries for each complex/unit?

总之,没有.对于每个相关表,您应该运行单独的查询.这就是大多数ORM(对象关系映射/建模)系统所能做的.

如果性能确实是一个问题(并且,基于你所说的,它将不会),那么你可以考虑使用像APC,memcache或Xcache这样的东西来缓存结果.

猜你在找的PHP相关文章