2012-03-07 18 views
7

Mam bazę danych CouchDB (powiemy, że zawiera ona dane związane z kartą czasową projektu: kod projektu, nazwisko osoby, stanowisko pracy, zadanie, datę, przepracowane godziny, stawkę za rachunki itp.). Chcę utworzyć podsumowujące widoki projektu w ciągu dnia ... lub według osoby, zadania lub według tytułu lub dowolnego pojedynczego atrybutu.W CouchDB, czy funkcja wyświetlania wielu emulatorów do emulowania zapytania typu ad hoc wysadzić w powietrze mój rozmiar kanapy?

Obawiam się, że zmierzam w kierunku niezrównoważonej ścieżki i że rozmiar mojej bazy danych może okazać się większy niż powinien.

Utworzono widok z funkcją mapy, która emituje każdy dokument kilka razy, raz dla każdego atrybutu. To działa. Ale czy to kiedykolwiek osiągnie punkt końcowy, w którym należy się zatrzymać?

mam wiele emituje:

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); 

Wtedy zawsze kwerendy z kluczem startu/końca [projektu], aby [projekt, {}]

Czy moja baza ostatecznie po prostu tak ogromne co sprawia, że ​​dodawanie nowych danych jest zbyt kosztowne? Czy multi-emit() jest preferowaną metodą robienia tego, co próbuję zrobić? Czy istnieje lepsze/inne wyjście?

Czy tworzenie dynamicznych emisji w oparciu o dokument wymagałoby tylko kłopotów w przypadku pojawienia się gigantycznego dokumentu i stworzenia ogromnych wymagań dotyczących pamięci masowej?

Zasadniczo, czy jest jakiś punkt, w którym powinienem po prostu zatrzymać szaleństwo?

Odpowiedz

9

Przede wszystkim: Nie emitują doc jako wartość ... &include_docs=true można użyć, jeśli trzeba dane w tabelach wynikowych.

drugie: Zakładając, że doc posiada więcej niż jeden projekt:

czy to ma sens, prosząc o projektach na dzień bez miesiącu? Jeśli nie, można użyć emit([doc.project,'monthday',doc.month,doc.day],1) następnie można poprosić o wszystkich projektach w miesiącu:

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

dnia miesiąca:

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

Jeśli używasz prostego Reduce-function (_sum) możesz odnieść korzyść z pytania, ile dni projekt ma (+ w ciągu miesiąca):

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 

użyciu group_level = 4 (tak samo jak zmniejszyć = false):

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

oczywiście można połączyć z tym ostatnim przypadku z & include_docs = true, aby uzyskać dane

trzecie:

Można emitować więcej niż jedną wartość na dokument ... Oczywiście, że możesz rozdzielić emitowane sygnały na różne widoki, więc nie potrzebujesz drugiego klucza. Spróbuj dowiedzieć się, jakie informacje należy ze sobą i są bezużyteczne bez innych

czwarta (jak dzień/miesiąc, osoba/jobtitle):

to nie jest drogie dodawanie danych .. widoki właśnie budowlanych; -)

Powiązane problemy