【问题标题】:Couchbase data modelling - Document orientedCouchbase 数据建模 - 面向文档
【发布时间】:2012-01-14 17:15:39
【问题描述】:

这个问题不一定是 Couchbase 2.0 开发预览版,但我认为它可以帮助人们调查新的 Couchbase 产品。

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

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

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

请注意,这不代表我们的产品,我并不是要求人们为我们解决我们的建模问题,这个问题更适合讨论

假设客户在特定日期/时间购买产品,产品包含 ID、名称、描述和价格等信息,购买是在某个日期执行的。

最初的要求是能够计算两个日期之间的所有购买。任何 1 天都可能有超过 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 函数吗?如果可以,您将如何对数据进行建模?

非常感谢阅读本文的任何人 - 如果可能的话,我希望进一步解释这一点,提供更多真实世界建模问题的示例。

詹姆斯

【问题讨论】:

标签: nosql data-modeling couchbase document-based-database


【解决方案1】:

在最简单的情况下,您可以编写一个 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"
}

您的地图功能如下所示:

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

希望对您有所帮助。

-- 约翰

【讨论】:

  • 很好的答案,谢谢!那么这是用 couchbase 建模数据的常用方法吗?例如。假设我只想知道每天售出多少产品(而不是总价值),这通常会像这样建模,然后用视图和地图/减少计算,还是人们倾向于按照他们的预期存储数据阅读它 - 通过使用计数器(incr)函数或类似的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2011-06-24
  • 1970-01-01
  • 2014-08-23
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多