Couchbase数据建模 - 文档导向

7
这个问题不一定与Couchbase 2.0开发预览有关,但我认为它可能会帮助那些调查新的Couchbase产品的人们。
我正在寻求数据建模方面的建议。我们正在调查Couchbase,以便可能将其用于实时分析。
然而,我找不到任何关于如何最好地建模现实世界数据的文档。
我将提出一个场景,如果社区能够帮助我或讨论一些想法,这将非常有用?
请注意,这并不代表我们的产品,我也不是在要求别人为我们解决建模问题,这个问题更多的是用于讨论。
假设客户在特定日期/时间购买产品,产品带有诸如id、名称、描述和价格等信息,购买是在某个日期执行的。
最初的要求是能够计算出两个日期之间的所有购买次数。对于任何一天,可能会有超过100,000次购买——这是一个相当大的业务;)
如果我们像下面这样建模数据(这可能完全不正确): 带有产品的购买
{
    "_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函数吗?如果是这样,您将如何对数据进行建模?
非常感谢阅读本文 - 我希望能进一步扩展这个问题,并提供更多实际建模问题的例子。
詹姆斯

大家好,Couchbase IRC 频道上的一位热心用户向我指出了“CouchConf”世界巡回演讲页面。每个会议都有很多带视频和幻灯片的演讲。http://www.couchbase.com/couchconf-world-tour特别是旧金山的会议有很多支持材料。http://www.couchbase.com/couchconf-sanfrancisco - eggsy84
1个回答

6
在最简单的情况下,您可以编写一个Map函数,使用日期字段作为键来创建视图。
因此,稍微修改文档设计如下:
{
   "_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"
}

您的map函数应该长这样:
function(doc) {
  for (var product in doc.products) {
    emit(doc.date, doc.products[product].price);
  }  
}

您可以选择添加一个reduce函数,该函数将按日期汇总购买金额。

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建模数据的常见方式吗?例如,假设我只想知道每天销售了多少产品(而不是总价值),通常会这样建模,然后使用视图和map/reduce计算,还是人们倾向于按照他们期望阅读的方式存储数据 - 使用计数器(incr)函数或类似的东西? - eggsy84

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接