2012-01-14 2 views
7

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

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

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

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

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

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

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

Там может быть сотни тысяч покупок между двумя датами и клиент не любит ждать отчетов ... .as Я уверен, что каждый испытал;)

было бы лучше использовать INCR функции, и если да, то как вы собираетесь моделировать данные?

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

Джеймс

+0

Привет всем, Полезным пользователя на канале IRC Couchbase указал мне в направлении мировых страниц турне «CouchConf». Существует множество презентаций с видеороликами и сопутствующими слайдами с каждой из конференций. http://www.couchbase.com/couchconf-world-tour В частности, в Сан-Франциско имеется много вспомогательного материала. http://www.couchbase.com/couchconf-sanfrancisco – eggsy84

ответ

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

Ваша функция карта будет выглядеть так:

function(doc) { 
    for (var product in doc.products) { 
    emit(doc.date, doc.products[product].price); 
    } 
} 

Можно по желанию добавить функцию уменьшения, что бы подытожить покупки по дате.

function(keys, values) { 
    return sum(values); 
} 

Затем вы можете запросить представление, используя параметры ключа запуска и конечной клавиши.

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? Например. Предположим, что все, что я хотел знать, - это то, сколько продуктов было продано в день (а не общая стоимость), как правило, это было бы таким образом смоделировано, а затем вычислялось с учетом и отображением/уменьшением или люди склонны хранить данные по мере их поступления читать его - используя функцию counters (incr) или что-то подобное? – eggsy84

Смежные вопросы