php - 干净的 OO 结构与 SQL 性能

标签 php sql design-patterns oop domain-driven-design

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

假设我创建了一个包含两个表的数据库:authorsblogs,它们在我的应用程序中都有相应的模型。

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

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

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

SELECT * FROM blogs
JOIN authors ON authors.id = blogs.author

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

最佳答案

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

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

关于php - 干净的 OO 结构与 SQL 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1165229/

相关文章:

android - 滑动即可完成 Activity 模式

PHP错误无法在写入上下文中使用方法返回>值

php - Laravel 如何通过用户 ID 获取关注者数量?

sql - 这种表结构最具扩展性的设计是什么

mysql - 选择一行及其周围的行

java - OO游戏设计题

用于停止从浏览器运行脚本的 PHP 代码

php - 调用非对象的成员函数 bindParam()

c# - SQL查询选择谜题

java - 无需修改基类即可更改行为