Yii声称使用他们的AR简化了DB编程,但我更关心将DB与我的代码“融合”得太过紧密。我显然知道它们可以一起工作,但映射有点令人担忧。我希望在DB中存在尽可能多的控件和约束,并想知道摆脱纯SQL是否会在任何方面限制性能。
ActiveRecord非常适合具有相对简单ORM的系统,其中Model == Table,具有1对1关系。换句话说,如果所有数据对象都适合单个表中(可能还有一些额外的表与它们相关),那么ActiveRecord就是为您而设计的。通常情况下,您可以设计软件使其符合这种情况!
但是你是正确的,它确实在一定程度上“混合”了DB实现和代码。假设Model == Table,这意味着数据库实现与您的代码并不分离。如果您在多个表中存储复杂的Models,则ActiveRecord会出现一些问题。但这是一个相当复杂的论点,我不会进入。其他模式(如Data Mapper)可以提供更大的灵活性,但需要更多的初始编码工作。
ActiveRecords 是一种设定即可忘记的编程方式。非常容易和快速。无需繁琐编写getter和setter,只需使用从表格中构建的漂亮PHP对象。我最近使用Yii构建了一个相当大的应用程序,我喜欢ActiveRecord的速度和简单性。我现在正在使用Zend开发一个应用程序,尽管我可以看到他们的方式给你更多的控制权,但我想念AR的轻松程度。;)
Yii ActiveRecord无疑简化了与数据库的编程,就像任何体面的ActiveRecord实现一样。
关于数据库和您的模型之间的映射,没有问题会使您的代码“接管”您的数据库。您唯一需要始终保持最新的是:
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'my_table';
}
考虑到表名不会经常更改,这并不是一个实际的问题。
你的ActiveRecord模型中还有其他部分应该与模式保持同步:
public function rules()
],外键模型关系[public function relations()
],属性标签[public function attributeLabels()
]等。然而,即使这些不反映当前的数据库模式,你仍然可以使用模型和数据库本身--只是相应的功能将不再起作用。
这些数据片段不会 强制执行 数据库约束,它们只是通过允许你以更直观的方式访问功能来帮助你。 实际的约束仍然在数据库中实现。
CDbCommand
自己编写SQL查询。我没有看到这样做的理由,但如果您需要,始终可以使用该选项。因此,无论您需要做什么,都不会因ActiveRecord的缺陷而被置于困境。