在我工作的地方,我们使用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。两者看起来都很棒但是,我们需要对库存做一些其他的工作:
根据结构和要求,CouchDB或MongoDB适合我们吗?如果是这样,哪一个最适合?
感谢阅读,并提前感谢您的答案。
编辑:我喜欢CouchDB的原因之一是我们在前端应用程序中可以在页面加载后直接从服务器通过JavaScript请求数据,并显示结果而无需使用任何后端代码。这将导致更好的页面加载和更少的服务器压力,因为数据的提取/处理将在客户端完成。答案 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。