首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP/MySQL OOP:从SQL加载复杂对象

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

Stack Overflow用户
提问于 2009-08-28 20:24:08
回答 4查看 2.5K关注 0票数 8

所以我正在为一个房地产经纪人做一个项目。我的设计中有以下对象/MySQL表:

代码语言:javascript
复制
Complexes
Units
Amenities
Pictures
Links
Documents
Events
Agents

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

代码语言:javascript
复制
Complexes have a single Agent.
Complexes have multiple Units, Amenities, Pictures, Links, Documents, and Events.
Units have multiple Pictures, Links, and Documents.

便利设施、图片、链接、文档和事件在数据库中都有必要的外键,以指定它们所属的单元/综合体。

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

如果我尝试在一个查询中选择表中的所有数据,使用左连接,我将得到每个唯一单元的至少(链接数)*(图片数)*(文档数)行。再加上便利设施和事件,我就会得到每个complex...Not的*#便利设施*#个事件,当然我想把它加载到PHP中的一个对象中。

另一种可能性是,对于每个复合体/单元,分别针对链接、图片、文档、事件和设施执行一条单独的SQL语句

我的问题如下:

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

如果没有,我如何才能获得需要加载到PHP对象中的数据。理想情况下,我应该有一个如下所示的单位对象:

代码语言:javascript
复制
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的研究,但大多数(全部阅读)在线示例只使用了一个表。这显然没有帮助,因为我正在处理的项目有许多复杂的关系。有什么想法吗?我说得太离谱了吗?

谢谢

更新

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

我希望避免的是,在一个页面加载期间,执行一个查询来获得我需要的复杂内容。然后再进行另一个查询,以获得与该复合体相关联的20个单元。然后,对于20个单元中的每个单元,执行一次图片查询,另一次查询文档,另一次查询链接,等等。我希望通过一次数据库访问,一次性获得所有这些查询。

编辑2还请注意,从数据库中选择图片、文档、链接、事件和代理的查询非常简单。只是从表WHERE primary_key = value中选择列的基本列表,带有偶尔的内连接。我没有做任何复杂的计算或子查询,只是基本的东西。

基准因此,在阅读了我的问题的所有答案后,我决定对我决定做的事情运行一个基准。我所做的就是加载我需要的所有单元。然后,当我需要显示图片,文档,诸如此类的东西时,我在那个时候加载它们。我创建了30,000个测试单元,每个单元包含100张图片、100个文档和100个链接。然后我加载了一定数量的单元(我从1000开始,然后是100,然后是更真实的10),遍历它们,然后加载与该单元相关的所有图片、文档和链接。对于1000个单元,大约需要30秒。使用100个单元,大约需要3秒。对于10个单元,大约需要.5秒。结果有很大的差异。有时,使用10个单元时,需要.12秒。那就需要.8了。然后可能是.5。然后是.78。它真的是到处都是。然而,它似乎平均在半秒左右。但实际上,我一次可能只需要6个单元,每个单元可能只有10张图片、5个链接和5个与them...so相关的文档。我认为在这种情况下,“在需要的时候获取数据”的方法是最好的选择。但是,如果您需要一次获取所有这些数据,那么想出一条SQL语句来加载您需要的所有数据将是值得的,这样您只需循环一次数据(一次6700个单元需要217秒,而完整的30,000个单元会使PHP耗尽内存)。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-08-28 20:42:23

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

简而言之,不是。对于每个相关的表,您可能应该运行单独的查询。这是大多数ORM (对象关系映射/建模)系统都会做的事情。

如果性能确实是个问题(根据您所说的,它不会是问题),那么您可以考虑使用诸如APC、memcache或Xcache之类的东西来缓存结果。

票数 4
EN

Stack Overflow用户

发布于 2009-08-28 20:36:16

ORM的要点不是每次都加载整个对象。重点是让你的应用程序访问object变得容易和透明。

也就是说,如果您需要单元对象,那么加载单元对象,并且只加载单元对象。如果您需要代理对象,则在需要时加载它,而不是在加载单元对象时加载。

票数 0
EN

Stack Overflow用户

发布于 2009-08-28 20:45:10

也许你应该考虑拆分这件事。

当你初始化你的对象时,只需要获取该对象运行所需的详细信息。如果你需要更多的细节,那么就去获取它们。您可以这样分配负载和处理:对象只获得运行所需的负载和处理,当需要更多负载和处理时,它就会获得它。

因此,在您的示例中-首先创建复杂结构。当您需要访问一个单元时,然后创建该单元,当您需要代理时,然后获取该代理,等等。

代码语言:javascript
复制
$complexDetails = array('id' => $id, etc);
$complexUnits = array();
.........
$complexUnits[] = new unit();
.........
$complexDetails['agent'] = new Agent();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1349147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档