清理OO结构与SQL性能

Thi*_*ijs 25 php sql oop design-patterns domain-driven-design

在PHP中编程时,我总是尝试创建与数据库中的表对应的有意义的"模型"(类).我经常遇到以下问题:

假设我已经创建了一个包含两个表的数据库:authors并且blogs在我的应用程序中都有相应的模型.

假设我想打印所有博客以及有关作者的信息,我必须做这样的事情:

<?php
foreach ($app->getBlogs() as $blog) {
  echo "<h1>" . $blog->title . "</h1>";
  echo "Written by" . $blog->getAuthor()->name . "</p>";
  // ... et cetera
}
?>
Run Code Online (Sandbox Code Playgroud)

问题是,应用程序现在将触发1个SQL查询以获取所有博客项目和[博客项目数]查询以获取每个作者的信息.使用简单的SQL我可以使用简单的查询检索此信息:

SELECT * FROM blogs
JOIN authors ON authors.id = blogs.author
Run Code Online (Sandbox Code Playgroud)

处理此类问题的最佳方法是:开发面向对象的应用程序而不执行太多无用的SQL查询.

Pol*_*878 3

IMO,我认为你应该编写另一个类来封装你所拥有的内容。博客拥有作者总是有意义吗?每个作者都有博客吗?一个作者可以拥有多个博客吗?考虑这些问题,然后设计一个类来封装它。请记住,典型的数据库模式不是面向对象的……它们是关系型的。是的,它们很接近,但也有细微的差别。

因此,如果一个作者可以拥有多个博客,您就可以拥有某种多值类的键(键基于作者 ID),并且您可以使用一个 SQL 调用来初始化或加载此类。只是一些需要考虑的事情。