我正在修补CodeIgniter并且第一次遇到Active Records。起初我把它视为不熟悉如何编写SQL的人的东西。我现在意识到我的分析存在缺陷,Active Records非常突出,特别是在Rails中。
但Active Records的目的是什么?是从抽象的不同RDBMS个性中抽象出来的。如果是这样,我认为这不是SQL的意思。此外,什么是最佳做法,我应该使用这些吗?
提前致谢
答案 0 :(得分:9)
Active Record是数据访问的设计模式......
目前,我似乎遇到了两种关于数据访问的主要设计模式:ActiveRecord和存储库模式
有效记录
您的对象包含将其状态保存到DB(或其他持久性机制)的方法,所以:
您可能有一个Customer对象。
Customer对象将有一堆方法,如Customer.Save();, Customer.Get(int id);和别的。
这些方法实际上与现实世界中的客户无关。它们实际上与您的应用程序的基础结构有关。
存储库模式
在存储库模式中,您的客户对象将是POCO或哑对象。它只有代表客户真正需要的方法和属性(如名称,电子邮件地址,列表订单等)。
当您想要坚持客户时 - 您只需将其传递到您的存储库
Repository.Save(MyCustomer)。
Active记录模式可以快速轻松地使用。不幸的是,它确实使用这些与客户无关的方法使您的域模型变得混乱。这使得随着时间的推移维护域模型变得稍微困难一些。
对于很多情况,使用Active记录模式是非常合适的。例如 - 如果我正在编写一个可能不会发生太大变化的相当简单的应用程序,我可能会启动SubSonic并生成我的Active Record DAL。我将在20分钟内编写我的业务代码,并且已经完成了所有数据库内容。
另一方面,如果我正在建模一个特别复杂的域,很容易发生变化,我宁愿保持我的域模型干净,并使用nHibernate或类似的实现存储库模式...
自从我使用ADO.Net推出自己的数据访问以来已经有很长一段时间了,我现在并没有真正推荐它,因为现在有很多很棒的数据访问工具。
答案 1 :(得分:7)
“Active Record Pattern”正在成为大多数编程框架的核心部分。它可以更快地实现更简单的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模型非常有用!
答案 2 :(得分:3)
我可以对这种模式给出我自己的观点,但是Martin Fowler对Active Record(以及其他许多)的最佳报道是Patterns of Enterprise Application Architecture。
从第10章开始:
活跃记录
包装行中的行的对象 数据库表或视图,封装 数据库访问,并添加域 该数据的逻辑。
一个对象携带数据和 行为。大部分数据都是 持久的,需要存储在 数据库。 Active Record使用最多 明显的方法,放置数据访问 域对象中的逻辑。这条路 所有人都知道如何阅读和写作 他们与数据库之间的数据。
...
何时使用
Active Record很不错 域逻辑的选择也不是 复杂的,如创造,读, 更新和删除。衍生和 基于单个记录的验证 在这种结构中运作良好。
...
Active Record具有主要功能 简单的优点。这很容易 建立活动记录,他们是 容易明白。他们的主要 问题是,只有当它们运作良好时 Active Record对象对应 直接到数据库表: 同构模式。
如果您的公司 逻辑是复杂的,你很快就会想到 直接使用你的对象 关系,收藏, 继承等等。这些没有 轻松映射到Active Record,和 零碎地添加它们会变得非常混乱。 这将导致您使用数据 而不是Mapper
答案 3 :(得分:1)
如果有的话,它使编写查询更容易。我发现正常的MySQL语法容易出现语法错误(没有错误,但我自己的错误),并且CI活动记录语法很少发生在我身上。
Active Record是CI恕我直言中最酷的功能之一
答案 4 :(得分:0)
Active Record是一个ORM - 您是否看过对象关系映射技术?我想如果您了解ORM,您将开始看到它的好处。