`
andyhu1007
  • 浏览: 199267 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ActiveRecord的ORM问题域 Q&A

阅读更多

切尔斯基的ORM问题域 ,他提供了Hibernate的解答,现在来看看在ActiveRcord中是如何解决的。大多数解决方案都大同小异,但有些完全不同。

1. 加载根对象时如何避免加载大半个数据库

    同样,“更多的时候,这是一个建模问题”。使用eager load还是lazy load是用户的选择,根据特定场景而定。

 

    ActiveRecord和Hibernate一样,即可以在模型之间指定load方式,也可以在特定查询里面eager load,根据上句话,后者是更好的选择。

 

    Session per request, Open Session in View pattern

 

 

 

    Database Connection

 

     在非线程安全时,每个application instance都会被分配一个database connection。实现线程安全之后:

 

写道
Instead of a single database connection for a given Rails instance, there will be a pool of connections, allowing N database connections to be used by the M requests executing concurrently. It also means allowing requests to potentially execute without consuming a connection, so the number of live, active connections usually will be lower than the number of requests you can handle concurrently.
 

2. 存储时如何更新整个对象图

    切尔斯基已经做了解答:

切尔斯基 写道
框架支持级联更新. 是否应该级联更新, 哪些操作可以级联, 哪些不可以, 对象之间的哪些类型的关联可以级联, 哪些不可以, 则是程序员的责任。

3. 存储时如何高效地更新整个对象图

    答案未知。

 

4. 何时同步对象的内存状态和持久存储状态

    基本上在transaction commit的时候。另外reload方法也会导致内存状态和持久存储状态的更新。

 

5. 如何确保在出错时保持对象内存状态和持久存储状态之间的一致性

 

切尔斯基 写道
数据库事务回滚, 清空内存缓存, 重新加载

 

6. 如何保证引用的唯一性以避免可能的更新冲突

    这个答案跟Hibernate的实现有很大不同(至少目前,Rails2.3.6)

 

    ActiveRecord没有实现Identity Map。当然你要是想用,可以在这里找到一个简单实现:http://github.com/pjdavis/identity-map 。不过ActiveRecord的identity map好像已经在计划之中了。

 

    所以,如果两个对象持有同一个record,则互相并不会知道对方的存在。如下:

 

user1 = User.find(1)
user2 = User.find(1)

user1.update_attribute(:name => 'fuck')
user2.save  // 覆盖上个更新 

 

7. 性能优化问题

  1. N+1查询问题

  2. 分离查询模型和存储模型

  3. 尽量减少查询语句

    关于1和3,在我的这篇文章中有详细解释:http://huzhenbo.name/blog/2010/01/16/rails-performance-tuning

 

8. ActiveRecord Query Cache

写道
Query caching is a Rails feature that caches the result set returned by each query. If Rails encounters the same query again during the current request, it will used the cached result set as opposed to running the query against the database.

 

     ActiveRecord的query cache起到和Hibernate中的session一样的第一级缓存的作用。

 

Reference:

http://martinfowler.com/eaaCatalog/identityMap.html

http://takacsot.freeblog.hu/Files/martinfowler/identityMap.html

 

 

----EOF----

 

 

1
0
分享到:
评论
1 楼 andyhu1007 2010-04-07  
刚帮同事trouble shoot了一个问题:

def update
  if @deal.update_attributes(params[:deal])
    @deal.riders.each do |rider|
      p rider.detail
      p Details.last
      p Details.find_by_rider_id(rider.id)
  else
  ...
... 


条件:rider的detail是在update时新建的

问:上面三个输出各是什么,为什么?

相关推荐

    Python的ORM框架Thing.zip

    Thing 是无网不剩(lzyy)用 SQLAlchemy 核心开发的一款 Rails ActiveRecord 风格 ORM。 SQLAlchemy 是 Python 界著名 ORM 框架,地位与 Java 界 Hibernate 类似。而 Thing 不是对 SQLAlchemy 的包装,只使用了其...

    ActiveRecord简单实例_activerecord.zip

    首先,让我们了解ActiveRecord的核心概念:ORM(Object-Relational Mapping)。ORM允许开发者使用面向对象的编程语言来操作数据库,而无需直接编写SQL语句。ActiveRecord通过为每个数据库表创建一个对应的Ruby类,...

    Ruby-ActiveImporter能够加载电子表格或CVS文件的数据至任何类似ActiveRecord的ORM框架中

    Ruby-ActiveImporter是一个强大的工具,专门设计用于将电子表格(如Excel、CSV)中的数据高效地导入到使用ORM(对象关系映射)框架,特别是类似于ActiveRecord的框架中。这个库简化了数据处理过程,使得开发者可以...

    scala-activerecord:Scala的类似于ActiveRecord的ORM库

    scala-activerecord是Scala的ORM库。 该库的灵感来自Ruby on Rails的ActiveRecord。 它是按照CoC(配置公约),DRY(请勿重复自己)的原则设计的。 最小的例子 样本片段: 模型实施: package models import ...

    NHibernate中文教程+activerecord

    ActiveRecord是基于NHibernate的一个轻量级框架,它结合了ORM和领域驱动设计(DDD)的概念。使用ActiveRecord,可以直接在对象上执行CRUD操作,无需通过Session,使得代码更简洁。 8. ** Castle ActiveRecord** ...

    Poseidon:使用 Rack 和 ActiveRecord ORM 的迷你 MVC Web 框架

    ActiveRecord::Migration def up create_table :posts do |t| t.string :title t.string :body t.timestamps end end 创建模型: 模型/post.rb class Post < ActiveRecord::Base end 创建控制器: ...

    基于ActiveRecord思想开发的至简化的java的Orm框架.zip

    本压缩包“基于ActiveRecord思想开发的至简化的java的Orm框架.zip”显然提供了一个简化版的Java ORM解决方案。 在ORM框架中,ActiveRecord模式的主要特点包括: 1. **对象-关系映射**:ORM框架的核心功能是将Java...

    Pro ActiveRecord Databases with Ruby and Rails.pdf

    1. **对象关系映射(ORM)**: ActiveRecord实现了ORM技术,能够自动将数据库表中的记录映射为内存中的对象,反之亦然。 2. **查询构建器**: 提供了一个强大的查询构建器,支持复杂的SQL语句构造,无需编写原生SQL...

    GoRecord-一个类似于ActiveRecord的Go ORM。-Golang开发

    这意味着它是类似于ActiveRecord的Go ORM。 有100万个Go ORM,但没有一个与ActiveRecord一样好。 sqlboiler接近了,但是我不喜欢依赖于单独的配置文件,或者缺少迁移器。 关于GoRecord的含义是类似于ActiveRecord的...

    scala-activerecord-specs_2.9.2-0.2.3.zip

    而"scala activerecord scalatraactiverecord"则暗示Scala Activerecord可能与ScalatraActiverecord有关,ScalatraActiverecord是一个基于Scalatra框架的扩展,用于提供ORM(对象关系映射)功能。ORM库使得开发者...

    Net下ORM框架概述

    Castle ActiveRecord是基于NHibernate的轻量级ORM框架,它扩展了NHibernate,引入了ActiveRecord模式,将数据访问逻辑与业务对象融合在一起,使得代码更简洁。 4. iBATIS.NET iBATIS.NET是.NET版本的iBATIS,它允许...

    Neo:Orm框架:基于ActiveRecord思想开发的至简化且功能很全的Orm框架

    Neo是一个基于JDBC开发的至简化框架,采用ActiveRecord的思想进行设计,名字源于《黑客帝国》男主角名字,为连接虚拟与现实的救世主,取名Neo寓意为链接数据和逻辑。源头来自于之前接触的一些不错的Orm框架,也有...

    简单Castle.ActiveRecord.Generator

    ActiveRecord组件是针对ORM(对象关系映射)设计的,它允许开发者直接在类中定义与数据库表的映射,从而避免了传统的ADO.NET繁琐的SQL编写工作。通过使用 Castle ActiveRecord,开发者可以专注于业务逻辑,而不是...

    ActiveRecord模式的ORMOrator.zip

    Orator ORM 提供了一个简单而优美的 ActiveRecord 实现。它有部分灵感来自于 Laravel 框架的数据库部分,但很大程度上修改为更 pythonic。功能特性:一个简单但强大的 ORM数据库不可知 Schema Builder一个低级别的...

    [IronRuby] C# 4.0调用ActiveRecord

    ActiveRecord是一种为对象关系映射(Object-Relational Mapping, ORM)提供的模式。它是Ruby on Rails框架中的一部分,允许开发人员通过使用Ruby代码以面向对象的方式来管理数据库记录。ActiveRecord使得数据访问...

    C# Castle.ActiveRecord CS源码示例教程.zip

    Castle.ActiveRecord 是一款基于 C# 的轻量级对象关系映射(ORM)框架,它为 .NET 开发者提供了简化数据库交互的方式。这个教程主要围绕如何使用 Castle.ActiveRecord 在 C# 项目中实现 ActiveRecord 设计模式,...

    castle ActiveRecord 源代码

    深入研究Castle ActiveRecord的源代码,可以帮助我们更好地理解ORM的工作原理,掌握面向对象与数据库操作的结合方式,提升开发效率,同时也能为我们提供解决实际问题的灵感和思路。在实际项目中,结合C#的特性,灵活...

    Castle.ActiveRecord (.NET FrameWork 2.0)

    版本太低,存在很多问题,于是在官方源码的基础上,我重新编译将其升级到了NHibernate基于.NET Framework 2.0的最高可用版本:2.1.2.4000。本资源包含Castle.ActiveRecord源文件和整套使用Castle.ActiveRecord所需的...

    PHP库通过返回原始SQL来实现ActiveRecord 用于PHP5.3和NO PDO场景的yii2 ORM移植

    在IT行业中,数据库管理和ORM(对象关系映射)是至关重要的部分,特别是在Web应用程序的开发中。本项目针对的是PHP5.3环境以及不支持PDO(PHP数据对象)的场景,提供了一个基于Yii2框架的ORM实现,名为“ArSql”。...

    PluSQL:针对SQL爱好者的基于非ActiveRecord的ORM

    PluSQL:面向SQL爱好者的ORM 提供者: 对于了解SQL并喜欢它的人,PluSQL是基于ActiveRecord的非ORM。 尽管PluSQL是为PHP 5.3(特别是针对mysql / mysqli)编写的,但我希望人们能够以其他语言/框架提供非基于...

Global site tag (gtag.js) - Google Analytics