BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Sequel:Ruby的数据库工具包

| 作者 Sebastien Auvray 关注 0 他的粉丝 ,译者 颜勋 关注 0 他的粉丝 发布于 2008年12月23日. 估计阅读时间: 9 分钟 | 如何结合区块链技术,帮助企业降本增效?让我们深度了解几个成功的案例。

实际上ActiveRecord才是Rails的ORM。但除了ActiveRecord外,Sequel(v2.7.1)提供了一个更为完整的Ruby工具包来处理数据库的操作。

- Sequel具有线程安全,连接池等特性,同时提供了简洁的DSL用来创建数据库查询以及表方案。
- Sequel也包含一个轻量级但更全面的ORM层用来映射记录和Ruby对象并处理相关联的记录。
- Sequel支持高级的数据库特性,比如语句准备,参数绑定主/从配置,以及数据库分片
- Sequel使得处理多个记录更加方便。
- Sequel当前提供的适配器可以支持ADO、DB2、DBI、Informix、JDBC、MySQL、ODBC、OpenBase、Oracle、PostgreSQL以及SQLite3。 
Sequel DSL的一个例子:
DB[:countries].filter(:region => 'Middle East').reverse_order(:area).limit(5).avg(:GDP)
 
其将会被翻译成SQL语句:
SELECT avg(GDP) FROM countries WHERE region = 'Middle East' ORDER BY area DESC LIMIT 5
 
项目的最新修改会反映在changelog中,最新的稳定版本可以查看项目基线。

InfoQ有机会采访了Jeremy Evans,在访问中他谈及了关于Sequel的进展和与ActiveRecord性能和特性比较的一些问题。

InfoQ ─ 在以前的采访中,Sharon Rosner提到,他启动Sequel项目的原因在于Rails缺乏多线程和连接池的特性。但自从Rails 2.2版本开始,Rails已经支持这些特性了,那么我们是否还应该选择Sequel呢?

Jeremy ─ 我没有用过ActiveRecord新的连接池的特性,因此我不能将其与Sequel进行比较。Sequel的连接池特性在我接管这个项目之前就已经完成并使用了,而且从其反馈来看几乎没有问题,因此我非常自信的认为Sequel的实现是健壮的。时间会告诉我们是否ActiveRecord的实现也一样好。

还有什么其他的原因吗?是否Sequel相对于ActiveRecord在处理大数据集和多个记录上更为敏捷?尽可能的避免纯SQL,是不是让Sequel相对于ActiveRecord更ruby化?是否在其他的一些领域Sequel的性能比ActiveRecord要好?或者不如ActiveRecord?

Sequel使用SQL并将其暴露在ruby层次上。对于ActiveRecord来说,你需要使用SQL字符串来拼接生成查询语句,而使用Sequel你只需要直接使用ruby对象。Sequel当然是一个更ruby化的数据库工具库,你甚至可以不使用任何的SQL串而完成特殊的应用。

两个框架的有一些方面甚至完全不一样。比如,Sequel支持主/从数据库、数据库分片、绑定参数以及语句准备。ActiveRecord不支持这些(至少是不使用插件时不支持),但是ActiveRecord的方案解析器相比Sequel特性更为丰富,而且ActiveRecord支持一些其他相关的类型(比如多态关联特性),Sequel也可以支持但是使用起来不很方便。

我不确信是否性能是使用Sequel(或者ActiveRecord)的一个原因。有些情况,比如,当选择很多你并不使用的列时ActiveRecord的性能更好。Sequel执行类型转换是在从数据库获取数据时就进行转换,而ActiveRecord直到使用数据时才延迟进行转换。这并不是一个主要的问题,除非你使用的类型是日期型,因为ruby的日期型的数据实例化起来非常慢。要是你只是选择一些你使用的列的话,Sequel应该会更快。如果查询可以简化为一条单独的语句,未进行优化的情况下,Sequel的执行效果相对要差,反之会优于ActiveRecord。

尽管Sequel支持很多的数据库,但是大多数性能上的改进都是面向PostgreSQL或MySQL的;对于其他数据库操作性能上的改进你是否一样有信心呢?

在我的产品应用程序的开发中只使用到了PostgreSQL数据库,所以大多数的数据库的优化工作都是针对PostgreSQL的,因为这对我的应用程序最有好处。有些应用程序的测试中,我使用到了SQLite ,而且唯一一次使用MySQL是跟它一起测试Sequel时用到的。其他Sequel支持的数据库我自己还没有测试过。

针对你的问题,我的答案是“没有”,我并没有充足的信心,因为我还没有将Sequel用于其他的数据库进行应用的经历。但我印象中还没有人提出关于性能方面的意见。

这些采访的时间是在10个月以前,当时Sequel的版本还是0.5版本。从那时起,你负责领导这个项目的开发。那么,就你个人而言,你认为v2.7.1最重要的特性有哪些呢?在开发路线图中,未来是否会有什么非常特别的特性么?你是否有一些开发者使用Sequel进行Rails/Merb开发成功的案例?

直至1.2版本我才开始使用Sequel,因此对于以前的一些修改我并不清楚。从1.2版本起,最重要的修改以及新的特性是:

1) 返璞归真:在2.0版本之前,Sequel的实现采用了很多奇技淫巧。在版本1.5至2.0之间,对该特性进行了很多重要的修改,使得代码更为清晰而且更便于使用。

2) 文档:当我接管这个项目的时候,Sequel 大部分都没有文档。而现在,所有的Sequel至少都有基本的文档,除了一些适配器之外。

3) 关联:Sequel具有任何ruby ORM上最强大的关联特性。ActiveRecord实现了一些很少使用的特殊的关联类型(比如多态关联特性),而Sequel更加强大,它通过将更多的内部工作暴露给用户同时允许更细粒度的控制实现了ActiveRecord不允许的一些关联特性。 

4) 数据集图解:这个特性使你可以连接两个任意的数据集(表),并将结果分成要素表。当你需要连接两个有同名列的表,又不想使用列别名再手动将结果集拆分成要素表时,这个特性就能派上用处,它能为你搞定这一切。

5) 表达式过滤器DSL:以前对于高级的过滤来说,Sequel使用解析树,其性能不尽人意而且不能在JRuby或是Ruby 1.9上使用。 表达式过滤器DSL非常易用,性能更好,可以在所有ruby的实现框架上使用。DSL可以使类似“dataset.filter(:number > 2)”的代码正确运行。 

6) JRuby和Ruby 1.9支持:三个最为广泛使用的ruby实现Sequel现在都支持。 

7) 语句准备/参数绑定:Sequel允许使用真实的数据库的准备语句以及在一些数据库上的参数绑定,一些其他数据库上模拟支持此特性。准备语句相比普通查询来说要快很多,当然跟使用的数据库有关系。

8) 主/从数据库以及数据库分片:Sequel 支持主/从(只读)数据库,以及数据库分片。 

未来的路线图方面,还没有太多的考虑。我的思想很开放,但是目前Sequel的特性基本上满足了所有的需要。现在的工作主要是修改一些细节的问题,还没有什么计划的新特性。

我知道有很多使用Sequel的Rails、Merb、Ramaze以及Sinatra的应用实现。就我个人而言,在应用开发中使用的就是Sequel和Rails或Ramaze。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

什么是要素表? by 贾 延平

有人能解释一下吗?

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

1 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT