Как преобразовать следующую схему MySQL в CouchDB? - PullRequest
2 голосов
/ 14 августа 2010

Я не уверен, как спроектировать следующую проблему в CouchDB.

У меня есть веб-приложение для ведения журнала, которое отслеживает, сколько предметов находится на складе.Чтобы упростить задачу, нам просто нужно знать общее количество товаров, находящихся в настоящее время на складе, и сколько времени каждый товар находится на складе до его отправки.Допустим, на складе есть только обувь, но у каждой обуви свой идентификатор и нужно отслеживать по идентификатору.

MySQL schema looks like this

    id       name        date-in       data-out
    1        shoe       08/0/2010      null
    2        shoe       07/20/2010     08/01/2010


The output will be
    Number of shoe in warehouse:  1 
    Average time in warehouse:    14 days

Спасибо

Ответы [ 2 ]

2 голосов
/ 16 августа 2010
Ответ

jhs отличный, но я просто хотел кое-что добавить:

Чтобы использовать встроенную функцию уменьшения для вычисления avg (_stats в вашем случае), вы должны использовать два «отдельных»Просмотры.Но если ваша map-функция точно такая же, CouchDB обнаружит это и не сгенерирует совершенно новый индекс для этого второго представления.Таким образом, вы можете иметь одну функцию карты, передающую несколько функций уменьшения.

1 голос
/ 15 августа 2010

Если каждый башмак является документом с date_in и date_out, то ваша функция уменьшения будет +1, если date_out равно нулю, и +0 (без изменений), если date_out не равно нулю.Это даст вам общее количество обуви на складе.

Чтобы вычислить среднее время для каждой обуви, вы знаете время на складе.Таким образом, функция уменьшения просто накапливает среднее значение.Так как функции приведения должны быть коммутативными и ассоциативными, вы используете другой алгоритм усреднения.Самый простой способ - уменьшить массив до [sum, count], где sum - это накопитель всех времен для всех ботинок, а count - счетчик подсчитанного количества ботинок.Затем клиент просто делит sum / count, чтобы вычислить окончательное среднее значение.

Я думаю, что вы можете объединить оба из них в одно большое сокращение, если хотите, возможно, создавая объект типа {"shoes in warehouse": 1, "average time in warehouse": [253, 15]}.

Однако, если вы можете принять два разных представления для этих данных, тогда существует среднее значение для ярлыка.На карте emit(null, time), где time - время, проведенное на складе.В режиме уменьшения установите полное значение уменьшения на _stats (см. Встроенные функции уменьшения ).Вывод представления будет объектом с уже вычисленными sum и count.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...