写给YII的建议,关于数据库的操作

在YII的性能优化里面提到几个很关键的东西,其中一个就是overuse Active Record,不要过度使用AR,不过按照我的理解,就是AR不适合做数据量大或PV高的应用,而且YII提倡我们使用DAO来操作数据,其实我用了以后发现一个很明显的问题

yii似乎只提供了pdo的操作类,比如我的服务器就没有安装PDO这个是比较烦人的,最让我恐惧的就是每次都要使用什么


$command=$connection->createCommand($sql);

然后再去查询,说实话我感觉非常非常的复杂,为什么不去使用$connection->getAll($sql);这种方式呢,很明显createCommand又返回了一个新的class

建议:YII提供2个数据库操作类,一个是基于PDO一个是基于php的原生连接,但是这2个类的接口都要一致,便于我们快速切换,而且不影响开发,比如都有exec(),getRow(),getAll(),getOne()…,目前我用的YII我已经完全抛弃了yii的model,说实话其复杂性有些让我捉摸不透,而我希望是能有一个更加简化的方式来操作数据库,然后我们可以写model使用这些操作DB,后续我会把我的思路整理出来,如果做数据缓存我们可以在getROW/getAll…里面来做缓存接口,但一定要简单,不要有太多反而复杂的类

一般数据库量大的项目,瓶颈都不会是在ar,而是sql~

关于$connection->createCommand($sql)->queryAll()的用法,它的确不如你建议的$connection->getAll($sql)简洁。

不过这样设计的好处是你可以重用这个生成的command对象,为它绑定不同的参数进行多次查询。另外,相关的类实现在层次上也更清晰了(这里模仿的是.NET的设计)。

关于PDO,这是今后PHP在数据库支持方面的主要方向。如果你的服务器不支持,你可以要求支持,或者使用PDO的模拟:http://sourceforge.net/projects/phppdo/

关于model,建议你再多研究一下。纯粹手写SQL当然没问题,但是使用model可以大大提高你的开发速度,也利于你的代码组织和维护。

缓存可以在不同层次上进行。在页面和片段层次上进行缓存要比数据缓存简单有效。

<_< 和楼主刚好相反,我用yii都是尽量在避免手写SQL,说实话,手写的SQL不见得就比自动生成的效率差,至于说性能问题,主要还是在join吧?所以我一般都尽量避免去join表,宁愿多查一次,根据我的实践观察,多那么几次数据库查询并不一定就会拖慢系统的速度,前题是你的数据表结构设计的合理^_^

不用PDO的话很难保持接口一直吧?而且用原有的mysql操作函数,如何绑定参数?难道还要自己手动去处理注入。

假如你用过zf的model的话你会觉得yii是如此的亲切