我有一個問題,我一直在努力,現在回答了一段時間,但無法弄清楚:原則建模的CouchDB文檔
如何設計,或瓜分,CouchDB的文件呢?
以博客文章爲例。
半 「關係」 的方式做到這一點是創建幾個對象:
- 後
- 用戶
- 評論
- 標籤
- 片段
這非常有道理。但我正在嘗試使用couchdb(出於所有原因,它很棒)來模擬相同的事情,這非常困難。
大部分的博客文章給你一個簡單的例子,如何做到這一點。他們基本上以相同的方式劃分它,但是說你可以爲每個文檔添加'任意'屬性,這絕對是很好的。所以你必須在CouchDB中是這樣的:
- 後(與標籤和片斷「僞」車型在DOC)
- 評論
- 用戶
有些人甚至會說你可以扔在那裏的評論和用戶,所以你有這樣的:
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文檔中提取評論,以便將它們導入評論模型中,與用戶和標籤相同。
但後來我想,「爲什麼不乾脆把我的整個網站到單個文件?」:
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" ... } } } } }
你可以很容易地使視圖來找到你想和什麼。
那麼我的問題是,您如何確定何時將文檔分成較小的文檔,或何時在文檔之間建立「關係」?
我認爲這將是更加「面向對象」,也更容易映射到值對象,如果它被分成像這樣:
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 } }
...但隨後開始看起來更像一個關係數據庫。而且我經常會繼承一些看起來像「整個網站在一個文件中」的東西,所以用關係模型化它更加困難。
我讀過很多有關如何/何時使用關係數據庫與文檔數據庫的內容,因此這不是主要問題。我更想知道的是,在CouchDB中建模數據時應用的最佳規則/原則是什麼。
另一個例子是XML文件/數據。一些XML數據嵌套深度超過10個層次,我想用相同的客戶端(例如Rails上的Ajax或Flex)可視化我將從ActiveRecord,CouchRest或任何其他對象關係映射器呈現JSON的情況。有時我會得到整個站點結構的巨大XML文件,就像下面的文件一樣,我需要將它映射到Value Objects以在我的Rails應用程序中使用,因此我不必編寫其他序列化/反序列化數據的方式:
<pages> <page> <subPages> <subPage> <images> <image> <url/> </image> </images> </subPage> </subPages> </page> </pages>
所以一般CouchDB的問題是:
- 什麼規則/原則,你用瓜分你的文件(關係等)?
- 可以將整個網站放入一個文檔嗎?
- 如果是這樣,你如何處理具有任意深度級別的序列化/反序列化文檔(如上面的大json示例或xml示例)?
- 或者您是否將它們轉化爲VO,您是否決定「這些內容過於嵌套到對象關係映射,因此我只能使用原始XML/JSON方法訪問它們」?
非常感謝您的幫助,關於如何使用CouchDB分隔數據的問題一直很難說「這就是我應該從現在開始做的事情」。我希望很快到達那裏。
我研究了以下網站/項目。
- Hierarchical Data in CouchDB
- CouchDB Wiki
- Sofa - CouchDB App
- CouchDB The Definitive Guide
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
...但他們還沒有回答這個問題。
哇你在這裏寫了一篇文章... :-) – Eero 2009-10-07 10:46:35
嘿,這是一個很好的問題 – elmarco 2009-10-07 19:43:29