你对这种模式有什么看法(原文如此),特别是关于CodeIgniters的实现?
关于CI的实施不能说太多。一般来说,除了最简单的应用程序之外,我避免AR。如果表与我的业务对象不匹配1:1,我就不使用AR,因为这会使应用程序建模变得困难。我也不喜欢将持久性层耦合到我的业务对象的想法。这违反了关注点分离。为什么产品应该知道如何自我拯救?延伸阅读:http://kore-nordmann.de/blog/why_active_record_sucks.html
编辑 在@kemp的评论之后,我查看了CI用户指南,看看他们是如何实现AR的:
正如您在 PoEAA 中看到的那样,AR 是一个对象,它将一行包装在数据库表或视图中,封装数据库访问,并在该数据上添加域逻辑。但这不是CI所做的。它只是提供了一个用于构建查询的 API。我了解到有一个 Model 类可以扩展 AR,可用于构建业务对象,但那时它更像是行数据网关。请查看 PHPActiveRecord 以获取替代实现。
将数据库包装在另一层中是否存在任何速度问题?
每当您将某些内容抽象或包装成其他内容时,您都可以确定这比原始操作对性能有影响。问题是,您的申请是否可以接受。找出答案的唯一方法是通过基准测试。延伸阅读:https://stackoverflow.com/search?q=orm+slow
编辑对于CI的简单查询构建API,我认为性能影响是可以忽略的。从逻辑上讲,组装查询将比仅使用将原始 SQL 字符串传递到数据库适配器花费更多的时间,但这应该只是微秒。而且,据我所知,在用户指南中,您还可以缓存查询字符串。但如有疑问,请进行基准测试。
在尝试构建非常复杂的查询时,它(逻辑)是否会变得混乱?
取决于您的查询。我见过非常混乱的SQL查询。当通过OO界面表达时,这些不会变得更漂亮。根据 API 的不同,您可能会发现无法通过它表达的查询。但话又说回来,这取决于您的查询。
优点是否排在缺点之外?
只有你能决定。如果它让你作为程序员的生活变得容易,那么为什么不呢。如果它符合您的编程需求,是的。Ruby on Rails在很大程度上建立在(AR)概念之上,所以它不可能那么糟糕(尽管我们可以对此进行争论,太:))