在我工作的地方,我们使用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
}
由于我们显然不能在inventory_items
中使用brand
或star_rating
作为列名,到目前为止,我们的解决方案是使用通用列名,如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
}
这很有效...在一定程度上.它笨重、不直观,而且缺乏可扩展性.我们必须投入资源来建立库存模式.使用单独的表格不是一种 Select .
输入NoSQL.有了它,我们可以让每一项都有自己的参数,并且仍然将它们存储在一起.从我所做的研究来看,这显然是一个很好的 Select .
具体来说,我研究了CouchDB和MongoDB.两个看起来都很棒.然而,我们需要处理库存中的其他一些细节:
- 我们需要能够从一个(或几个)存货中 Select 商品.
- 我们需要能够根据其参数筛选项目(例如,从库存2中获取所有项目,其中类型为"hotel").
- 我们需要能够根据参数对商品进行分组(例如,从库存1中品牌为"三星"的商品中获得最低价格).
- 我们需要(潜在地)能够一次检索数千件物品.
- 我们需要能够访问来自多个应用程序的数据;后端(处理数据)和前端(显示数据).
- 需要快速批量插入,但不是必需的.
基于 struct 和需求,CouchDB或MongoDB是否适合我们?如果是,哪一个最合适?
感谢阅读,并提前感谢您的回答.
编辑:我喜欢CouchDB的原因之一是,我们在前端应用程序中可以在页面加载后通过JavaScript直接从服务器请求数据,并显示结果,而无需使用任何后端代码.这将导致更好的页面负载和更少的服务器压力,因为数据的获取/处理将在客户端完成.