在我工作的地方,我们使用Ruby on Rails来创建后端和前端应用程序.通常,这些应用程序与同一MySQL数据库交互.它适用于大多数数据,但我们有一种情况可以转移到NoSQL环境.
我们有客户,我们的客户拥有我们所谓的"库存" - 其中一个或多个.库存可以包含数千个商品.这是目前通过两个关系数据库表进行,inventories
和inventory_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 }
因为我们显然不能使用brand
或star_rating
作为列名inventory_items
,我们的解决方案至今一直使用通用列名,例如text_a
,text_b
,float_a
,int_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请求数据,并显示结果而无需使用任何后端代码.这将导致更好的页面加载和更少的服务器压力,因为数据的提取/处理将在客户端完成.
我在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
您可能需要阅读http://chemeo.com/doc/technology,他们处理MongoDB的任意属性搜索问题.