Моделирование данных Couchbase - Ориентированный на документ - PullRequest
7 голосов
/ 14 января 2012

Этот вопрос не обязательно разрабатывается специально для предварительного просмотра Couchbase 2.0, однако я думаю, что он может помочь людям в изучении нового продукта Couchbase.

Я ищу совет по моделированию данных. Мы исследуем Couchbase с целью возможного использования его для аналитики в реальном времени.

Однако я не могу найти никакой документации о том, как лучше всего моделировать данные реального мира.

Я предложу сценарий, и если сообщество сможет мне помочь или обсудить некоторые идеи о том, как это можно смоделировать, это будет очень полезно?

Обратите внимание, что это не репрезентативно для нашего продукта, и я не прошу людей решать наше моделирование для нас, вопрос больше предназначен для обсуждения

Предположим, что клиенты совершают покупки товаров в определенную дату / время, товары имеют такую ​​информацию, как идентификатор, имя, описание и цена, покупка совершается в определенный день.

Первоначальное требование - иметь возможность считать все покупки между двумя датами. За один день может быть более 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, и если да, то как бы вы занялись моделированием данных?

Большое спасибо всем, кто читает это - я надеюсь рассказать об этом дальше, приведя больше примеров реальных проблем моделирования, если это возможно.

Джеймс

1 Ответ

6 голосов
/ 17 января 2012

В простейшем случае вы могли бы написать функцию 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);
  }  
}

При желании можно добавить функцию уменьшения, которая суммирует покупки по дате.

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

Надеюсь, это поможет.

- Джон

...