Jun'uary

RDDB: Ruby Document-Oriented DataBase

Jan 发表于 2007-11-08 15:56:00

Document-Oriented Database,直译为面向文档的数据库,RDDB是它的一个Ruby实现。

什么是文档?大概可以理解为一个存储了hash table(Java里的Map)的文件,比如

Doc No.20071108
Name: Jan
Sex: Male
Career: President

这就是一个文档了,其中有很多hash entry, 比如Name => Jan. 来看一下RDDB的例子:

# First create an database object
database = Rddb::Database.new

# Put some documents into it
database << {:name => 'John', :income => 35000}
database << {:name => 'Bob', :income => 40000}

以上创建了一个新的数据库,插入了两条新的记录,很清晰不是吗。然后怎么读数据呢?需要用到一个叫做View的东西:

# Create a view that will return the names
database.create_view('names') do |document, args|
document.name
end

# The result of querying will return an array of names
assert_equal ['John','Bob','Jim'], database.query('names')

RDDB不是SQL,因为它不关注数据与数据之间的关系;也不是OODB,你用不着创建一个对象然后将之持久化;在RDDB中你看不到Schema, 你不需要创建Schema,你需要定义的是View。看起来RDDB是一个Domain Specific的数据库,如它的名字所说,Document Oriented. 它的长处在于处理文档信息,因为它的唯一的Schema就是按照文档的方式设计的。我相信RDDB用在创建如CRM, WIKI, Forum之类的应用的时候应该会很方便。

Ruby本身是一个非常适合做DSL的语言,RDDB的美妙之处在于,它利用了Ruby的这个优点,把block引进数据库中,相当于用大家熟悉的Ruby语法替换掉了SQL里面猥琐的聚合函数之类的东东,看下面的例子:

database.create_view('average income') do |document, args|
document.income
end.reduce_with do |results|
results.inject { |memo,value| memo + value } / results.length
end
assert_equal 37333, database.query('average income')

简直太爽了。。 
关键词(Tag): ruby database rddb



最新评论

发表评论

*昵称

已经注册过? 请登录

Email
网址
*评论
 
 

Jan'uary

人类一思考,老夫就发笑

搜索

日历