Моделирование данных Couchbase - Ориентированный на документ
Этот вопрос не обязательно разрабатывает предварительный просмотр Couchbase 2.0, однако я думаю, что он может помочь людям в изучении нового продукта Couchbase.
Я ищу советы по моделированию данных. Мы исследуем Couchbase с целью возможного использования его для аналитики в реальном времени.
Однако я не могу найти документацию о том, как лучше всего моделировать данные реального мира.
Я предложу сценарий, и если сообщество сможет мне помочь или обсудить некоторые идеи о том, как это можно смоделировать, это будет очень полезно?
Обратите внимание, что это не репрезентативно для нашего продукта, и я не прошу людей решать наше моделирование для нас, вопрос больше предназначен для обсуждения
Предположим, что клиенты совершают покупки товаров в определенную дату / время, товары имеют такую информацию, как идентификатор, имя, описание и цена, покупка совершается в определенный день.
Первоначальное требование - иметь возможность считать все покупки между двумя датами. За любой 1 день может быть более 100000 покупок - это довольно большой бизнес;)
Если какой-либо синтаксис неверен, пожалуйста, дайте мне знать - все советы / помощь приветствуются.
Если мы смоделировали данные примерно так (что может быть совершенно неверно):
Покупки с продуктами
{
"_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 ответ
В простейшем случае вы могли бы написать функцию 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}
]}
Надеюсь, это поможет.
Джон