Active Records的目的是什么?

zen*_*nna 13 php database activerecord codeigniter

我正在修补CodeIgniter并且第一次遇到Active Records.起初我把它视为不熟悉如何编写SQL的人的东西.我现在意识到我的分析存在缺陷,Active Records非常突出,特别是在Rails中.

但Active Records的目的是什么?是从抽象的不同RDBMS个性中抽象出来的.如果是这样,我认为这不是SQL的意思.此外,什么是最佳做法,我应该使用这些吗?

提前致谢

Pau*_*aul 9

Active Record是数据访问的设计模式......

目前,我似乎遇到了两种关于数据访问的主要设计模式:ActiveRecord和Repository Pattern

积极记录

您的对象包含将其状态持久保存到DB(或其他持久性机制)的方法,因此:

您可能拥有Customer对象.

Customer对象将有一堆方法,如Customer.Save();, Customer.Get(int id); 和别的.

这些方法与现实世界中的客户实际上没有任何关系.它们实际上是关于应用程序的基础结构.

存储库模式

在存储库模式中,您的客户对象将是POCO或哑对象.它只有代表客户真正需要的方法和属性(如名称,电子邮件地址,列表订单等)

当您想要坚持客户时 - 您只需将其传递到您的存储库

Repository.Save(MyCustomer).

Active记录模式可以快速轻松地使用.不幸的是,它确实使用这些与客户无关的方法使您的域模型变得混乱.这使得随着时间的推移维护域模型变得稍微困难​​一些.

对于很多情况,使用Active记录模式是非常合适的.例如 - 如果我正在编写一个可能不会发生太大变化的相当简单的应用程序,我可能会启动SubSonic并生成我的Active Record DAL.我将在20分钟内编写我的业务代码,并且所有数据库内容都已经完成.

另一方面,如果我正在建模一个特别复杂的域,并且易于改变,我宁愿保持我的域模型干净,并使用nHibernate或类似的实现存储库模式......

自从我使用ADO.Net推出自己的数据访问以来,已经有很长一段时间了,我现在并不是真的推荐这么多可用的数据访问工具.


Mat*_*att 8

"Active Record Pattern"正在成为大多数编程框架的核心部分.它可以更快地实现更简单的CRUD(创建,更新,读取,删除)任务.例如,它不是必须编写许多SQL来插入,更新和删除许多常见和简单的数据对象,它允许您简单地将值分配给数据对象并运行命令,例如$ object-> save(),SQL是为你编译和执行.

大多数框架还在其各自的Active Record模型中实现数据关系,这可以极大地简化访问与对象相关的数据.例如,在CodeIgniter中,如果您指定类别"有很多"产品,那么在从数据库加载Category对象后,您可以使用简单的代码行列出它的子产品.

foreach ($category->products as $product) {
  echo $product->name;
}
Run Code Online (Sandbox Code Playgroud)

正如您所说,Active Record的另一个好处是,它可以使您的代码轻松移植到不同的数据库平台(只要您使用的框架具有所选数据库的驱动程序),尽管这看起来不太重要现在,如果您的应用程序变得流行,我将在以后更有价值!

希望这会有所帮助.维基百科很好地描述了Active Record(http://en.wikipedia.org/wiki/Active_record_pattern)以及CodeIgniter文档.就个人而言,我使用KohanaPHP(http://www.kohanaphp.com),这是CodeIgniter的PHP5唯一分支,我发现它的ORM模型非常有用!