ฉันมีคำถามที่พยายามหาคำตอบมาระยะหนึ่งแล้ว แต่คิดไม่ออก:
คุณออกแบบหรือแบ่งเอกสาร CouchDB อย่างไร?
ยกตัวอย่าง Blog Post
วิธีกึ่ง "เชิงสัมพันธ์" คือการสร้างวัตถุสองสามชิ้น:
- เสา
- ผู้ใช้งาน
- คิดเห็น
- แท็ก
- เศษเล็กเศษน้อย
สิ่งนี้สมเหตุสมผลมาก แต่ฉันพยายามใช้ couchdb (ด้วยเหตุผลทั้งหมดที่ว่ามันยอดเยี่ยม) เพื่อสร้างโมเดลสิ่งเดียวกันและมันก็ยากมาก
บล็อกโพสต์ส่วนใหญ่มีตัวอย่างง่ายๆในการทำเช่นนี้ โดยทั่วไปแล้วพวกเขาแบ่งออกในลักษณะเดียวกัน แต่บอกว่าคุณสามารถเพิ่มคุณสมบัติ 'ตามอำเภอใจ' ให้กับเอกสารแต่ละฉบับซึ่งดีมาก ดังนั้นคุณจะมีสิ่งนี้ใน CouchDB:
- โพสต์ (พร้อมแท็กและตัวอย่างโมเดล "หลอก" ในเอกสาร)
- คิดเห็น
- ผู้ใช้งาน
บางคนอาจบอกว่าคุณสามารถแสดงความคิดเห็นและผู้ใช้ในนั้นได้ดังนั้นคุณจะมีสิ่งนี้:
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"
}
}
}
ดูดีมากและเข้าใจง่าย ฉันยังเข้าใจว่าคุณสามารถเขียนมุมมองที่ดึงเฉพาะความคิดเห็นจากเอกสารโพสต์ทั้งหมดของคุณเพื่อนำไปใช้ในรูปแบบความคิดเห็นได้เช่นเดียวกับผู้ใช้และแท็ก
แต่แล้วฉันก็คิดว่า "ทำไมไม่รวมทั้งไซต์ของฉันไว้ในเอกสารเดียว":
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"
...
}
}
}
}
}
คุณสามารถดูเพื่อค้นหาสิ่งที่คุณต้องการได้อย่างง่ายดาย
คำถามที่ฉันมีคือคุณจะกำหนดได้อย่างไรว่าเมื่อใดควรแบ่งเอกสารออกเป็นเอกสารขนาดเล็กหรือเมื่อใดควรสร้าง "RELATIONS" ระหว่างเอกสาร
ฉันคิดว่ามันน่าจะเป็น "Object Oriented" มากกว่าและง่ายกว่าในการแมปกับ Value Objects หากแบ่งออกเป็นดังนี้:
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+ ระดับและฉันต้องการเห็นภาพว่าการใช้ไคลเอนต์เดียวกัน (เช่น Ajax บน Rails หรือ Flex) ที่ฉันต้องการแสดงผล JSON จาก ActiveRecord, CouchRest หรือ Object Relational Mapper อื่น ๆ บางครั้งฉันได้รับไฟล์ XML ขนาดใหญ่ที่เป็นโครงสร้างไซต์ทั้งหมดเช่นเดียวกับด้านล่างและฉันจำเป็นต้องแมปกับ Value Objects เพื่อใช้ในแอป Rails ของฉันดังนั้นฉันจึงไม่ต้องเขียนวิธีอื่นในการทำให้เป็นอนุกรม / deserializing ข้อมูล :
<pages>
<page>
<subPages>
<subPage>
<images>
<image>
<url/>
</image>
</images>
</subPage>
</subPages>
</page>
</pages>
ดังนั้นคำถามทั่วไปของ CouchDB คือ:
- คุณใช้กฎ / หลักการอะไรในการแบ่งเอกสารของคุณ (ความสัมพันธ์ ฯลฯ )?
- สามารถรวมทั้งไซต์ไว้ในเอกสารเดียวได้หรือไม่?
- ถ้าเป็นเช่นนั้นคุณจะจัดการกับเอกสาร serializing / deserializing ด้วยระดับความลึกที่กำหนดเองได้อย่างไร (เช่นตัวอย่าง json ขนาดใหญ่ด้านบนหรือตัวอย่าง xml)
- หรือคุณไม่เปลี่ยนให้เป็น VO คุณแค่ตัดสินใจว่า "สิ่งเหล่านี้ซ้อนอยู่กับ Object-Relational Map มากเกินไปดังนั้นฉันจะเข้าถึงโดยใช้วิธี XML / JSON แบบดิบ"
ขอบคุณมากสำหรับความช่วยเหลือของคุณปัญหาในการแบ่งข้อมูลของคุณกับ CouchDB เป็นเรื่องยากสำหรับฉันที่จะพูดว่า "นี่คือวิธีที่ฉันควรทำนับจากนี้" ฉันหวังว่าจะไปถึงที่นั่นเร็ว ๆ นี้
ฉันได้ศึกษาไซต์ / โครงการต่อไปนี้
- ข้อมูลลำดับชั้นใน CouchDB
- CouchDB Wiki
- โซฟา - แอป CouchDB
- CouchDB The Definitive Guide
- PeepCode CouchDB Screencast
- CouchRest
- CouchDB README
... แต่พวกเขายังไม่ได้ตอบคำถามนี้