我目前处于对我网站结构设计的制裁的僵局。目前我正在使用对象来简化我的网站结构(我有一个人物对象,一个聚会对象,一个位置对象等等),理论上每一个都是从它的各个表中的一行数据库中。
根据我所学到的,OO Design有助于保持简单易用/实现,我同意这一点 - 它使我的代码看起来更清晰,更易于维护,但我感到困惑关于我如何将我的对象链接到数据库。
假设有一个人物页面。我创建一个person对象,它等于一个mysql查询(这是合理的),但那个人可能有多个位置,我需要在一个页面上获取和显示。
我目前正在做的是从person对象中使用一个名为 getPositions 的方法,该方法从mysql获取数据并为每一行创建一个单独的位置对象,并将数据作为数组传递。这样可以将查询保持在最低限度(2页到一页),但对我来说这似乎是一个糟糕的实现,打破了面向对象设计的规则(如果我想更改mysql行,我需要更改它多个地方)但替代方案更糟糕。
在这种情况下,替代方案只是获取我需要的ID,然后创建单独的位置,传入ID,然后继续从构造函数中的数据库获取行。如果你每页有20个位置,它可以快速加起来,我已经阅读了每页大量查询的大小Wordpress is criticised以及它的CPU使用率。在这种情况下,我需要考虑的另一件事是排序,并且这样做意味着我需要使用PHP对数据进行排序,这肯定不如在mysql中本地执行它那样高效。
当然,页面将被(并且可以)缓存,但对我而言,这似乎就像是对构建不良的应用程序作弊。在这种情况下,什么是正确的解决方案?
答案 0 :(得分:0)
你现在的方式至少是在正确的轨道上。在父对象中具有对子节点的引用的数组基本上是如何在数据库中表示数据。
如果您将子项存储为父项数组中的引用,我不能完全确定您的问题,但您应该这样,这就是PHP默认存储它们的方式。如果您还对从数据库中提取的对象使用单例模式,则根本不需要修改多个对象来更改一行,如您在问题中所建议的那样。
您可能还应该为对象创建多个构造函数(使用返回新实例的静态方法),这样您就可以从它们的ID创建它们并让它们提取数据或者只从已有的数据创建它们。当你创造孩子时会使用后一种情况;您可以让父项为其子项提取所有数据,并仅使用一个查询创建所有数据。从其ID中获取一个孩子可能会在其他地方使用,所以只要需要它就可以了。
对于排序,您可以创建其他私有(或公共,如果需要)数组,这些数组以特定方式排序子项,并引用主数组引用的相同对象。