В CouchDB, будет ли функция карт с многократным излучением, чтобы эмулировать специальный тип запроса, взорвать мой размер Couch? - PullRequest
7 голосов
/ 07 марта 2012

У меня есть база данных CouchDB (скажем, она хранит данные, связанные с картой времени проекта: код проекта, человек, должность человека, задание, дата, отработанное время, их счет и т. Д.). Я хочу создать сводные представления проекта по дням ... или по человеку, или по задаче, или по заголовку, или по любому отдельному атрибуту.

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

Я создал представление с функцией карты, которая генерирует каждый документ несколько раз, по одному разу для каждого атрибута. Это работает. Но достигает ли это когда-нибудь конечной точки, где вы должны остановиться?

У меня есть несколько излучений:

emit([doc.project, 'day', doc.day], doc);
emit([doc.project, 'month', doc.month], doc);
emit([doc.project, 'person', doc.person], doc);
emit([doc.project, 'job title', doc.persons-job-title], doc);
emit([doc.project, 'task', doc.task], doc);

Затем всегда запрашивайте ключ начала / конца от [project,] до [project,, {}]

Будет ли моя база данных со временем настолько огромной, что добавление каких-либо новых данных будет чрезмерно дорогим? Является ли multi-emit () предпочтительным методом для выполнения того, что я пытаюсь сделать? Есть ли лучший / другой выход?

Будет ли создание emit'а динамически основанным на документе просто вызывать проблемы в случае прохождения какого-то гигантского документа и создания огромных требований к хранилищу?

В принципе, есть ли момент, когда я должен просто остановить безумие?

1 Ответ

9 голосов
/ 09 марта 2012

Прежде всего: Не выдавать документ в качестве значения ... вы можете использовать &include_docs=true, если вам нужны данные в наборах результатов.

Второе: Предполагается, что в вашем документе содержится более одного проекта:

Имеет ли смысл запрашивать проекты на день без Месяца?Если нет, вы можете использовать emit([doc.project,'monthday',doc.month,doc.day],1), тогда вы можете запросить все проекты за месяц:

startkey=["project1","monthday",3]&endkey=["project1","monthday",3,{}]

день месяца:

key=["project1","monthday",3,9]

Если вы используете простойФункция limit-(_sum) вы можете спросить, сколько дней у проекта (+ в месяце):

 startkey=["project1","monthday"]&endkey=["project1","monthday",{}]&group_level=3

...

"key":["project1","monthday",2],"value:1),  // 1 Day in month 2
"key":["project1","monthday",3],"value:2)   // 2 Days in month 3

с использованием group_level= 4 (то же самое, что и lower = false):

"key":["project1","monthday",2,20],"value:1), 
"key":["project1","monthday",2,21],"value:1),  
"key":["project1","monthday",3,1],"value:1), 

конечно, вы можете объединить последний случай с & include_docs = true, чтобы получить данные

Третий:

Можно выдавать более одного значения на документ ... Конечно, вы можете разделить эмиссии в разные представления, поэтому вам не нужен второй ключ.Попытайтесь выяснить, какая информация принадлежит друг другу и бесполезна без других (например, день / месяц, человек / название работы?)

Четвертый:

это не дорого, добавляяданные .. просто вид здания; -)

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