2012-01-14 66 views
7

这个问题不一定是Couchbase 2.0开发预览特定的,但我认为它可以帮助人们调查新的Couchbase产品。Couchbase数据建模 - 面向文档

我在寻找关于数据建模的建议。我们正在调查Couchbase以期可能将其用于实时分析。

但是我找不到有关如何最好地模拟真实世界数据的任何文档。

我会提出一个场景,如果社区能够帮助我或者讨论一些关于如何建模的想法,那将会非常有用吗?

注意这并不代表我们的产品,我不问的人来解决我们的模型对我们的问题是多个要讨论

让我们假设客户做出的产品购买在特定日期/时间,产品与他们的信息,如身份证,名称,说明和价格,购买是在一个日期进行。

最初的要求是能够计算两个日期之间的所有购买。对于任何1天可能有超过10万次购买 - 这是一个非常大的业务;)

如果任何语法不正确,请让我知道 - 欢迎所有建议/帮助。

如果我们建模的数据像这样(这可能完全不正确的):

购买的产品

{ 
    "_id" : "purchase_1", 
    "_rev" : "1-1212afdd126126128ae", 
    "products" : [ 
     "prod_1" : { 
      "name" : "Milk", 
      "desc" : "Semi-skimmed 1ltr", 
      "price" : "0.89" 
     }, 
     "prod_7568" : { 
      "name" : "Crisps", 
      "desc" : "Salt and Vinegar", 
      "price: "0.85" 
     } 
    ] 
    "date" : "2012-01-14 14:24:33" 
} 

{ 
    "_id" : "purchase_2", 
    "_rev" : "1-1212afdd126126128ae", 
    "products" : [ 
     "prod_89001" : { 
      "name" : "Bread", 
      "desc" : "White thick sliced", 
      "price: "1.20" 
     } 
    ] 
    "date" : "2012-01-14 15:35:59" 
} 

所以考虑到文档布局,我们可以看到每一个购买,我们可以看到那些正在购买的产品 - 但是我们如何计算两个日期之间的所有购买?另外你怎么能看到两个日期之间的所有采购日期按日期降序排列?

这是Couchbase适合的东西吗?

可能有成千上万的两个日期和客户之间的采购不喜欢等待报告......。至于我相信每个人都经历;)

难道是最好使用INCR函数,如果是的话,你将如何去建模数据?

非常感谢任何人读到这一点 - 我希望在此进一步阐述如果可能的话,给出更多真实世界建模问题的例子。

詹姆斯

+0

大家好, 在Couchbase IRC频道乐于助人的用户指出我在“CouchConf”世界巡回演唱会的页面的方向。 有很多演示文稿包含来自每个会议的视频和伴随的幻灯片。 http://www.couchbase.com/couchconf-world-tour 特别是旧金山有一个有很多辅助材料。 http://www.couchbase.com/couchconf-sanfrancisco – eggsy84 2012-01-16 13:44:57

回答

6

在最简单的情况下,你可以编写会创建一个使用日期字段作为键查看地图功能。

因此,与稍微修改文件设计:

{ 
    "_id": "purchase_1", 
    "_rev": "2-c09e24efaffd446c6ee8ed6a6e2b4a22", 
    "products": [ 
     { 
      "id": "prod_3", 
      "name": "Bread", 
      "desc": "Whole wheat high fiber", 
      "price": 2.99 
     } 
    ], 
    "date": "2012-01-15 12:34:56" 
} 

{ 
    "_id": "purchase_2", 
    "_rev": "2-3a7f4e4e5907d2163d6684f97c45a715", 
    "products": [ 
     { 
      "id": "prod_1", 
      "name": "Milk", 
      "desc": "Semi-skimmed 1ltr", 
      "price": 0.89 
     }, 
     { 
      "id": "prod_7568", 
      "name": "Crisps", 
      "desc": "Salt and Vinegar", 
      "price": 0.85 
     } 
    ], 
    "date": "2012-01-14 14:24:33" 
} 

你的地图功能看起来像:

function(doc) { 
    for (var product in doc.products) { 
    emit(doc.date, doc.products[product].price); 
    } 
} 

你可以选择添加一个功能降低会按日期总结购买。

function(keys, values) { 
    return sum(values); 
} 

然后,您可以使用startkey和endkey参数查询视图。

http://localhost:5984/couchbase/_design/Products/_view/total_price_by_date?startkey="2012-01-01"&endkey="2012-01-31"&group=true 

从查询视图中的输出是:

{"rows":[ 
{"key":"2012-01-14 14:24:33","value":4.94}, 
{"key":"2012-01-15 12:34:56","value":2.99} 
]} 

或删除组参数,以获得和整个日期范围:

{"rows":[ 
{"key":null,"value":7.930000000000001} 
]} 

希望有所帮助。

约翰 -

+1

很好的答案谢谢!那么这是使用couchbase为数据建模的常用方法吗?例如。假设我想知道的是每天销售的产品数量(而不是总价值),那么这通常会如此模拟,然后通过视图和地图/缩减进行计算,或者人们是否倾向于按照他们的期望存储数据阅读它 - 通过使用计数器(增量)功能或类似的东西? – eggsy84 2012-01-19 20:08:47

相关问题