所以我正在为一个房地产经纪人做一个项目。我的设计中有以下对象/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, Links, and Documents.便利设施、图片、链接、文档和事件在数据库中都有必要的外键,以指定它们所属的单元/综合体。
我需要将必要的对象从数据库加载到PHP中,以便在我的项目中使用它们。
如果我尝试在一个查询中选择表中的所有数据,使用左连接,我将得到每个唯一单元的至少(链接数)*(图片数)*(文档数)行。再加上便利设施和事件,我就会得到每个complex...Not的*#便利设施*#个事件,当然我想把它加载到PHP中的一个对象中。
另一种可能性是,对于每个复合体/单元,分别针对链接、图片、文档、事件和设施执行一条单独的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的研究,但大多数(全部阅读)在线示例只使用了一个表。这显然没有帮助,因为我正在处理的项目有许多复杂的关系。有什么想法吗?我说得太离谱了吗?
谢谢
更新
另一方面,通常在前端,每个人都会看到,我需要所有的信息。例如,当有人想要特定综合体的信息时,我需要显示属于该综合体的所有单元,该综合体的所有图片、文档、链接、事件以及该单元的所有图片、文档和链接。
我希望避免的是,在一个页面加载期间,执行一个查询来获得我需要的复杂内容。然后再进行另一个查询,以获得与该复合体相关联的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耗尽内存)。
发布于 2009-08-28 20:42:23
如果我正确地索引了所有的表,那么为每个复杂/单元执行3-5个额外的查询真的是一个坏主意吗?
简而言之,不是。对于每个相关的表,您可能应该运行单独的查询。这是大多数ORM (对象关系映射/建模)系统都会做的事情。
如果性能确实是个问题(根据您所说的,它不会是问题),那么您可以考虑使用诸如APC、memcache或Xcache之类的东西来缓存结果。
发布于 2009-08-28 20:36:16
ORM的要点不是每次都加载整个对象。重点是让你的应用程序访问object变得容易和透明。
也就是说,如果您需要单元对象,那么加载单元对象,并且只加载单元对象。如果您需要代理对象,则在需要时加载它,而不是在加载单元对象时加载。
发布于 2009-08-28 20:45:10
也许你应该考虑拆分这件事。
当你初始化你的对象时,只需要获取该对象运行所需的详细信息。如果你需要更多的细节,那么就去获取它们。您可以这样分配负载和处理:对象只获得运行所需的负载和处理,当需要更多负载和处理时,它就会获得它。
因此,在您的示例中-首先创建复杂结构。当您需要访问一个单元时,然后创建该单元,当您需要代理时,然后获取该代理,等等。
$complexDetails = array('id' => $id, etc);
$complexUnits = array();
.........
$complexUnits[] = new unit();
.........
$complexDetails['agent'] = new Agent();https://stackoverflow.com/questions/1349147
复制相似问题