我会选择“马为课程”的情况,它利用了两个世界的混合和匹配。我已经使用 RedBean 构建了一些大型应用程序,因此我的评论将仅关注 RedBean 而不是其他 ORM。
RedBean ORM 速度慢吗?
嗯,这取决于你如何使用它。在某些情况下,它比传统查询更快,因为 RedBean 将结果缓存几秒钟。重用查询将更快地产生结果。使用R::debug(true);查看日志它总是显示
"SELECT * FROM `table` -- keep-cache"
场景 1:获取所有 (*)
在 RedBean 中查询
$result = R::findOne('table', ' id = ?', array($id));
这表示为
$result= mysql_query("Select * from TABLE where id =".$id);
您可能会争辩说,如果表有多个列,为什么要查询 (*)。
场景 2:单列
获取单个列
R::getCol( 'SELECT first_name FROM accounts' );
就像我提到的“Horses for Courses”,开发者不应该仅仅依赖FindOne, FindAll, FindFirst, FindLast,还要仔细起草他们真正需要的东西。
场景 3:缓存
当您不需要缓存时,您可以在应用程序级别禁用,这不是理想的情况
R::$writer->setUseCache(true);
RedBean 建议,如果您不想在应用程序级别禁用缓存,则应使用带有 no-cache 参数的传统查询,例如 $result = R::exec("SELECT SQL_NO_CACHE * FROM TABLE");
通过完全丢弃查询缓存,完美解决了从表中获取实时数据的问题。
场景 4:快速发展
使用 ORM 使您的应用程序开发速度非常快,开发人员使用 ORM 进行编码的速度比编写 SQL 快 2-3 倍。
场景 5:复杂查询和关系
RedBean 提供了一种非常好的实现复杂查询和one-to-many 或many-to-many 关系的方法
用于复杂查询的普通 SQL
$books = R::getAll( 'SELECT
book.title AS title,
author.name AS author,
GROUP_CONCAT(category.name) AS categories FROM book
JOIN author ON author.id = book.author_id
LEFT JOIN book_category ON book_category.book_id = book.id
LEFT JOIN category ON book_category.category_id = category.id
GROUP BY book.id
' );
foreach( $books as $book ) {
echo $book['title'];
echo $book['author'];
echo $book['categories'];
}
OR RedBean 处理多对多关系的方式
list($vase, $lamp) = R::dispense('product', 2);
$tag = R::dispense( 'tag' );
$tag->name = 'Art Deco';
//creates product_tag table!
$vase->sharedTagList[] = $tag;
$lamp->sharedTagList[] = $tag;
R::storeAll( [$vase, $lamp] );
性能问题
像 ORM 之类的参数通常很慢,消耗更多内存并且往往会使应用程序变慢。我认为他们不是在谈论 RedBean。
我们已经使用 MySQL 和 Postgres 对其进行了测试,相信我的性能从来都不是瓶颈。
不可否认,ORM 增加的开销很小,而且往往会使您的应用程序变慢(只是一点点)。使用 ORM 主要是在开发人员时间和稍慢的运行时性能之间进行权衡。我的策略是首先使用 ORM 构建端到端的应用程序,然后基于测试用例,调整速度关键模块以使用直接数据访问。