首页 文章

Couchbase数据建模 - 面向文档

提问于
浏览
7

这个问题不一定是Couchbase 2.0开发的具体预览,但我认为它可能会帮助人们调查新的Couchbase产品 .

我正在寻找有关数据建模的建议 . 我们正在调查Couchbase,以便将其用于实时分析 .

但是,我找不到任何关于如何最好地模拟现实世界数据的文档 .

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

Note this is not representative of our product and I am not asking people to solve our modelling for us the question is more intended for discussion

让我们假设客户在特定日期/时间购买产品,产品有ID,名称,描述和价格等信息,在日期进行购买 .

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

如果任何语法不正确请告诉我 - 欢迎所有建议/帮助 .

如果我们将数据建模为类似的东西(可能完全不正确):

Purchases with products

{
    "_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函数,如果是这样,您将如何建模数据?

非常感谢任何阅读此内容的人 - 我希望能够在可能的情况下进一步提供更多真实世界建模问题的例子 .

詹姆士

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}
    ]}
    

    或者删除group参数以获取整个日期范围的总和:

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

    希望有所帮助 .

    • 约翰

相关问题