php – 使用许多一对多关系(ORM)减少MySQL中的查询
我目前正在使用基于Kohana框架构建的
PHP和MySQL设计应用程序.我正在使用内置的ORM,事实证明它非常有用.一切正常,但我非常关心在某些页面上运行的查询数量.
设置 有多少疑问? 至今… 我并不反对放弃ORM来显示应用程序的部分并继续使用查询构建甚至原始SQL. 对此的解决方案实际上可能非常简单,我现在只是对它一无所知,老实说这是一种解脱.或许它不是.我不确定.如果我的任何解释都不足以理解问题,那就问一下,我会试着给出一个更好的例子. (编辑:给出更好的例子,见下文 虽然,旁注… 非常感谢你! 编辑 让我们简化并说我们有3个主要表: 和1个支点: 我们将列出表格中的所有产品.在ORM中调用所有产品非常简单. foreach ($products->find_all() as $product) //given that $products is an ORM object { echo $product->product_id; //lets just pretend these are surrounded by html echo $product->product_name; foreach ($products->product_attributes->find_all() as $attribute) { echo $attribute->value; } foreach ($products->notifications->find_all() as $notification) { echo $notification->notification_label; } } 这当然过于简单,但这是我所说的原则.这已经很好了.但是,正如您所看到的,对于每个产品,它必须查询其所有属性以获取适当的集合或行. 如果我执行查询以获取一个查询中的所有数据,则执行以下操作: SELECT p.*,pa.*,n.* FROM products p LEFT JOIN product_attributes pa ON pa.product_id = p.product_id LEFT JOIN product_notifications pn ON pn.product_id = p.product_id LEFT JOIN notifications n ON n.notification_id = pn.notification_id (再次过度简化).这将获取数据本身,但根据产品的每个属性和通知,将返回带有冗余信息的额外行. 例如,如果我在数据库中有两个产品;一个有1个属性和1个标志,另一个有3个属性和2个标志,它将返回: product_id,product_date_added,product_attribute_id,value,notification_id,notification_label 1,My Product,10/10/10,1,Color: Red,Add This Product 2,Busy Product,10/11/10,2,Color: Blue,Update This Product 2,3,Style: New,Update This Product 不用说,这是一个很多冗余的信息.每个产品返回的行数将是它拥有的通知数量的属性数. ORM(或者,通常只是在循环中创建新查询)将每行中的所有信息合并到它自己的对象中,从而允许更逻辑地处理数据.那是摇滚乐.在一个查询中调用信息消除了对可能数百个查询的需要,但是在行中创建了大量冗余数据,因此不会以简洁的集合返回(一个/多个)到多个关系数据.那是个难点. 对不起,这么久,试图彻底,哈哈,谢谢! 解决方法
一个有趣的替代方案是使用完全独立的模型处理您的读取和写入. (命令查询分离).复杂的对象模型(和ORMS)非常适合于复杂的业务行为建模,但是作为查询和向用户显示信息的接口很糟糕.你提到你并不反对放弃使用ORM渲染显示器 – 嗯,这正是许多软件架构师现在提出的建议.编写一个完全不同的界面(具有自己的优化查询),用于读取和报告数据. “读取”模型可以查询与ORM支持的“写入”模型一起使用的相同数据库,也可以是针对您需要生成的报告/屏幕进行非规范化和优化的单独数据库.
看看这两个演示文稿.这可能听起来有点矫枉过正(如果你的性能要求非常低,可能就是这样),但是这种技术让这么多问题消失的感觉真是太棒了. > Udi Dahan: “Command-Query (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |