我正在修改 CodeIgniter,并且第一次遇到 Active Records。起初我认为它是为那些并不真正了解如何编写 SQL 的人准备的。我现在意识到我的分析是有缺陷的,并且 Active Records 非常突出,尤其是在 Rails 中。

但活动记录有什么用途呢?是为了从不同的 RDBMS 个性中抽象出来吗?如果是这样,我认为这不是 SQL 的目的。此外,最佳实践是什么,我应该使用这些吗?

提前致谢

有帮助吗?

解决方案

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

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

foreach ($category->products as $product) {
  echo $product->name;
}

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

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

其他提示

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

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

活动记录

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

您可能有一个 Customer 对象。

Customer 对象将有很多方法,例如 Customer.Save();、Customer.Get(int id);和别的。

这些方法实际上与现实世界中的客户没有任何关系。它们实际上与您的应用程序的基础设施有关。

存储库模式

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

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

存储库.保存(我的客户)。

活动记录模式快速且易于使用。不幸的是,这些方法确实使您的域模型变得混乱,而这些方法实际上与客户没有任何关系。随着时间的推移,这使得维护域模型变得稍微困难​​。

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

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

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

我可以对这种模式给出自己的看法,但Active Record(以及许多其他版本)的最佳报道是模式企业应用程序架构由Martin Fowler撰写。

从第10章开始:

  

活跃记录

     

包装行中的行的对象   数据库表或视图,封装   数据库访问,并添加域   该数据的逻辑。

     

一个对象携带数据和   行为。大部分数据都是   持久的,需要存储在   数据库。 Active Record使用最多   明显的方法,放置数据访问   域对象中的逻辑。这条路   所有人都知道如何阅读和写作   他们与数据库之间的数据。

     

...

     

何时使用

     

Active Record很不错   域逻辑的选择也不是   复杂的,如创造,读,   更新和删除。衍生和   基于单个记录的验证   在这种结构中运作良好。

     

...

     

Active Record具有主要功能   简单的优点。这很容易   建立活动记录,他们是   容易明白。他们的主要   问题是,只有当它们运作良好时   Active Record对象对应   直接到数据库表:   同构模式。

     

如果您的公司   逻辑是复杂的,你很快就会想到   直接使用你的对象   关系,收藏,   继承等等。这些没有   轻松映射到Active Record,和   零碎地添加它们会变得非常混乱。   这将导致您使用数据   而不是Mapper

如果有的话,它使编写查询更容易。我发现正常的MySQL语法容易出现语法错误(没有错误,但我自己的错误),并且CI活动记录语法很少发生在我身上。

Active Record是CI恕我直言中最酷的功能之一

Active Record是一个ORM - 您是否看过对象关系映射技术?我想如果您了解ORM,您将开始看到它的好处。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top