Bir süredir cevaplamaya çalıştığım ama çözemediğim bir sorum var:
CouchDB belgelerini nasıl tasarlar veya bölersiniz?
Örneğin bir Blog Yazısını ele alalım.
Bunu yapmanın yarı "ilişkisel" yolu, birkaç nesne oluşturmak olacaktır:
- İleti
- kullanıcı
- Yorum Yap
- Etiket
- Pasaj
Bu çok mantıklı. Ama aynı şeyi modellemek için couchdb'yi (harika olduğu tüm nedenlerden dolayı) kullanmaya çalışıyorum ve bu son derece zor.
Dışarıdaki blog yazılarının çoğu, size bunun nasıl yapılacağına dair kolay bir örnek veriyor. Temelde aynı şekilde bölüyorlar, ancak her belgeye 'keyfi' özellikler ekleyebileceğinizi söylüyorlar ki bu kesinlikle güzel. Yani CouchDB'de buna benzer bir şeye sahip olacaksınız:
- Gönderi (belgede etiketler ve snippet'ler "sözde" modellerle)
- Yorum Yap
- kullanıcı
Hatta bazı insanlar Yorum ve Kullanıcıyı oraya atabileceğinizi bile söylerdi, böylece şuna sahip olursunuz:
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
Bu çok hoş görünüyor ve anlaşılması kolay. Ayrıca, Kullanıcılar ve Etiketler ile aynı şekilde Yorum modellerine dahil etmek için tüm Gönderim belgelerinizden yalnızca Yorumları çıkaran görünümleri nasıl yazabileceğinizi de anlıyorum.
Ama sonra "neden tüm sitemi tek bir belgeye koymuyorsunuz?" Diye düşünüyorum:
site {
domain: "www.blog.com"
owner: "me"
pages {
page {
title: "Blog"
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author: {
name: "Lance"
age: "23"
}
tags: ["sample", "post"]
comments {
comment {
id: 93930414809
body: "Interesting Post"
}
comment {
id: 19018301989
body: "I agree"
}
}
}
post {
id: 18091890192984
title: "Second Post"
...
}
}
}
}
}
Bununla istediğinizi bulmak için kolayca görünümler oluşturabilirsiniz.
O halde sorduğum soru, belgeyi ne zaman daha küçük belgelere böleceğinizi veya belgeler arasında ne zaman "İLİŞKİ" kuracağınızı nasıl belirlersiniz?
Bence bu şekilde bölünmüş olsaydı, çok daha "Nesneye Yönelik" ve Değer Nesnelerine eşlemek daha kolay olurdu:
posts {
post {
id: 123412804910820
title: "My Post"
body: "Lots of Content"
html: "<p>Lots of Content</p>"
author_id: "Lance1231"
tags: ["sample", "post"]
}
}
authors {
author {
id: "Lance1231"
name: "Lance"
age: "23"
}
}
comments {
comment {
id: "comment1"
body: "Interesting Post"
post_id: 123412804910820
}
comment {
id: "comment2"
body: "I agree"
post_id: 123412804910820
}
}
... ancak sonra bir İlişkisel Veritabanı gibi görünmeye başlar. Ve çoğu zaman "belgede-tüm-site" gibi görünen bir şeyi miras alırım, bu yüzden onu ilişkilerle modellemek daha zordur.
İlişkisel Veritabanları ile Belge Veritabanları'nın nasıl / ne zaman kullanılacağı hakkında birçok şey okudum, bu yüzden buradaki ana sorun bu değil. Daha çok merak ediyorum, CouchDB'de verileri modellerken uygulanacak iyi bir kural / ilkenin ne olduğu.
Diğer bir örnek de XML dosyaları / verileridir. Bazı XML verilerinde 10+ düzey derinlikte iç içe geçme var ve JSON'u ActiveRecord, CouchRest veya başka herhangi bir Nesne İlişkisel Eşleştirici'den işlemek istediğim aynı istemciyi (örneğin, Rails üzerinde Ajax veya Flex) kullanarak görselleştirmek istiyorum. Bazen, aşağıdaki gibi tüm site yapısını oluşturan devasa XML dosyaları alıyorum ve Rails uygulamamda kullanmak için bunları Değer Nesneleri ile eşlemem gerekiyor, böylece verileri serileştirmenin / seriyi kaldırmanın başka bir yolunu yazmam gerekmiyor :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
Yani genel CouchDB soruları:
- Belgelerinizi (ilişkiler vb.) Bölmek için hangi kuralları / ilkeleri kullanıyorsunuz?
- Tüm siteyi tek bir belgeye koymak doğru mu?
- Öyleyse, keyfi derinlik seviyelerine sahip belgeleri serileştirmeyi / seriyi kaldırmayı nasıl halledersiniz (yukarıdaki büyük json örneği veya xml örneği gibi)?
- Yoksa onları VO'lara dönüştürmüyor musunuz, sadece "bunlar Object-Relational Map'e çok iç içe, bu yüzden onlara ham XML / JSON yöntemlerini kullanarak erişeceğim" mi diye mi karar veriyorsunuz?
Yardımınız için çok teşekkürler, verilerinizi CouchDB ile nasıl böleceğim konusunu "bundan sonra böyle yapmalıyım" demek benim için zor oldu. Yakında oraya varmayı umuyorum.
Aşağıdaki siteleri / projeleri inceledim.
- CouchDB'de Hiyerarşik Veriler
- CouchDB Wiki
- Sofa - CouchDB Uygulaması
- CouchDB Kesin Kılavuz
- PeepCode CouchDB Ekran Kaydı
- CouchRest
- CouchDB README
... ama bu soruyu hala yanıtlamadılar.