2012-03-07 16 views
7

Bir CouchDB veritabanım var (proje zaman kartıyla ilgili verileri tuttuğunu söyleyebiliriz: proje kodu, kişi, kişinin iş unvanı, görev, tarih, çalışılan saat, fatura oranı, vb.). Projenin özet görünümlerini güne ya da şahsen ya da göreve ya da başlığa ya da herhangi bir özel özniteliğe göre oluşturmak istiyorum.CouchDB'de, bir ad hoc türünde bir sorguyu taklit etmek için çoklu çıkışlı bir harita işlevi Couch boyutumu patlatır mı?

Sürdürülebilir olmayan bir yola gidiyorum ve veritabanı boyutumun olması gerekenden çok daha büyük olabileceğini düşünüyorum.

Her bir özellik için bir kez, her bir belgeyi bir kez gönderen bir harita işleviyle bir görünüm oluşturdum. Bu işe yarıyor. Ama bu hiç durmanız gereken bir bitiş noktasına ulaşıyor mu?

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

Sonra hep [projenin] bir başlangıç ​​/ bitiş anahtarla sorgulamak [proje, {}]

benim veritabanı sonunda sadece alacak kadar büyük

:

Birden yaydığı var Herhangi bir yeni veri eklemenin pahalıya mal olması için? Multi-emit() yapmaya çalıştığım şeyi yapmak için tercih edilen yöntem mi? Orada daha iyi/farklı bir yolu var mı?

Emit'in belgeye dayalı olarak dinamik olarak oluşturulmasını sağlamak, devasa bir belge olması ve büyük depolama gereksinimleri oluşturması durumunda sorun olmasını ister misiniz?

Temel olarak, çılgınlığı durduracağım bir nokta var mı? Her şeyden

cevap

9

İlk: Eğer sonuç kümesi verileri gerekirse, &include_docs=true kullanabilirsiniz ... bir değer olarak doktor yayarlar vermeyin.

İkincisi: varsayarsak, sizin doc birden fazla projeyi tutan:

o Ay olmadan bir günde projeler için soran mantıklı mı? Bir ayın

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

gün: Değilse, emit([doc.project,'monthday',doc.month,doc.day],1) o zaman bir Ay tüm Projeler için sorabilir kullanabilirsiniz

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

basit azaltmak-işlevini kullanıyorsanız (_sum) Eğer (+ bir ay içinde) bir proje vardır kaç gün, soran avantajına sahip olacaktır:

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 

kullanarak group_level = 4 (aynı = false azaltmak gibi):

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

tabii ki & include_docs ile son durum birleştirebilirsiniz = verileri almak için gerçek

Üçüncüsü:

Her belge için birden fazla Değer yaymanız yeterlidir ... Elbette yo Emisyonları farklı görünümlere ayırabilirsiniz, böylece ikinci anahtara ihtiyacınız yoktur. bilgi birlikte ait olduğu, anlamaya çalışın ve diğerleri olmadan yararsız

Dördüncü (gün/ay, kişi/JobTitle gibi?):

öyle değil pahalı veri .. sadece bina görüşlerini ekleyerek; -)