在我工作的地方,我们使用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
}

由于我们显然不能在inventory_items中使用brandstar_rating作为列名,到目前为止,我们的解决方案是使用通用列名,如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
}

这很有效...在一定程度上.它笨重、不直观,而且缺乏可扩展性.我们必须投入资源来建立库存模式.使用单独的表格不是一种 Select .

输入NoSQL.有了它,我们可以让每一项都有自己的参数,并且仍然将它们存储在一起.从我所做的研究来看,这显然是一个很好的 Select .

具体来说,我研究了CouchDB和MongoDB.两个看起来都很棒.然而,我们需要处理库存中的其他一些细节:

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

基于 struct 和需求,CouchDB或MongoDB是否适合我们?如果是,哪一个最合适?

感谢阅读,并提前感谢您的回答.

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

推荐答案

我在MongoDB上工作,所以你应该对此持保留态度,但这看起来非常适合Mongo.

  • 我们需要能够从一个(或几个)存货中 Select 商品.

对任何字段进行临时查询都很容易.

  • 我们需要能够根据其参数筛选项目(例如,从库存2中获取所有项目,其中类型为"hotel").

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

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

同样,超级简单:db.items.find({"brand" : "Samsung"}).sort({"price" : 1})

  • 我们需要(潜在地)能够一次检索数千件物品.

没问题.

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

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

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

你可能想读http://chemeo.com/doc/technology,他用MongoDB处理了任意的财产搜索问题.

Mongodb相关问答推荐

如何在MongoDB中通过限制和跳过查找项进行匹配

除非满足某个条件,否则Mongo是否按日期排序?

如何在Mongo中查找数组中的特定对象

Mongoose 排除数组中包含特定嵌套对象的文档

聚合管道可以用于更新数据库中的文档吗?

使用特定关键字和邻近度进行查询和过滤

从MongoDB迁移到PostgreSQL:为PostgreSQL编写聚合管道查询

如何在 mongodb golang 的单个更新调用中使用 $set 和 $inc?

Mongoose $inc 枚举验证失败

从命令行创建 MongoDB 用户

在 mongodb 的一次更新调用中推送到两个单独的数组

如何在mongodb中删除数组的第n个元素

Cannot connect to MongoDB errno:61

RoboMongo:不显示所有文档

如何将转储文件夹导入 mongodb 数据库?

Mongodb 设计,嵌入与关系

在 mongoose 中使用 UUID 进行 ObjectID 引用

如何在 golang 和 mongodb 中通过 id 查找

错误:需要数据和盐参数

如何使用 Spring 的 MongoTemplate 和 Query 类检索字段子集?