哪个CouchDB或MongoDB适合我的需求?

时间:2010-06-09 23:52:36

标签: mongodb couchdb database nosql

在我工作的地方,我们使用Ruby on Rails来创建后端和前端应用程序。通常,这些应用程序与同一MySQL数据库交互。它适用于大多数数据,但我们有一种情况需要转移到NoSQL环境。

我们有客户,我们的客户拥有我们所谓的“库存” - 其中一个或多个。库存可以包含数千个商品。目前,这是通过两个关系数据库表inventoriesinventory_items完成的。

当两个不同的库存具有不同的参数时,问题就开始了:

# Inventory item from inventory 1, televisions 
{
  inventory_id: 1
  sku: 12345
  name: Samsung LCD 40 inches
  model: 582903-4
  brand: Samsung
  screen_size: 40
  type: LCD
  price: 999.95
}

# Inventory item from inventory 2, accomodation
{
  inventory_id: 2
  sku: 48cab23fa
  name: New York Hilton
  accomodation_type: hotel
  star_rating: 5
  price_per_night: 395
}

由于我们显然无法使用brandstar_rating作为inventory_items中的列名,因此到目前为止,我们的解决方案一直使用通用列名,例如text_atext_bfloat_aint_a等,并引入第三个表inventory_schemas。表现在看起来像这样:

# Inventory schema for inventory 1, televisions 
{
  inventory_id: 1
  int_a: sku
  text_a: name
  text_b: model
  text_c: brand
  int_b: screen_size
  text_d: type
  float_a: price
}

# Inventory item from inventory 1, televisions 
{
  inventory_id: 1
  int_a: 12345
  text_a: Samsung LCD 40 inches
  text_b: 582903-4
  text_c: Samsung
  int_a: 40
  text_d: LCD
  float_a: 999.95
}

这一点运作良好......到目前为止。它很笨重,它不直观,缺乏可扩展性。我们必须投入资源来设置库存模式。使用单独的表不是一种选择。

输入NoSQL。有了它,我们可以让每个项目都有自己的参数,并仍然将它们存储在一起。从我所做的研究来看,对于这种情况来说,这似乎是一个很好的改变。

具体来说,我看过CouchDB和MongoDB。两者看起来都很棒但是,我们需要对库存做一些其他的工作:

  • 我们需要能够从一个(或几个)库存中选择项目。
  • 我们需要能够根据其参数过滤项目(例如,从库存2获取类型为'hotel'的所有项目。)
  • 我们需要能够根据参数对项目进行分组(例如,从品牌为'三星'的库存1中获取最低价格)。
  • 我们需要(可能)一次检索数千个项目。
  • 我们需要能够从多个应用程序访问数据;后端(处理数据)和前端(显示数据)。
  • 需要快速批量插入,但不是必需的。

根据结构和要求,CouchDB或MongoDB适合我们吗?如果是这样,哪一个最适合?

感谢阅读,并提前感谢您的答案。

编辑:我喜欢CouchDB的原因之一是我们在前端应用程序中可以在页面加载后直接从服务器通过JavaScript请求数据,并显示结果而无需使用任何后端代码。这将导致更好的页面加载和更少的服务器压力,因为数据的提取/处理将在客户端完成。

1 个答案:

答案 0 :(得分:17)

我在MongoDB上工作,所以你应该带着一点点盐,但这看起来非常适合Mongo。

  
      
  • 我们需要能够从一个(或几个)库存中选择项目。
  •   

在任何字段上进行即席查询都很容易。

  
      
  • 我们需要能够根据其参数过滤项目(例如,从库存2获取类型为'hotel'的所有项目。)
  •   

对此的查询是:{"inventory_id" : 2, "type" : "hotel"}

  
      
  • 我们需要能够根据参数对项目进行分组(例如,从品牌为'三星'的库存1中获取最低价格)。
  •   

再次,非常简单:db.items.find({"brand" : "Samsung"}).sort({"price" : 1})

  
      
  • 我们需要(可能)一次检索数千个项目。
  •   

没问题。

  
      
  • 需要快速批量插入,但不是必需的。
  •   

MongoDB的批量插入速度比CouchDB快得多。

此外,MongoDB还有一个REST接口:http://github.com/kchodorow/sleepy.mongoose

您可能希望阅读处理MongoDB的任意属性搜索问题的http://chemeo.com/doc/technology