CouchDB และเวอร์ชันเอกสาร


12

ขณะนี้ฉันกำลังทำงานกับแอปพลิเคชัน wiki-esque โดยใช้ CouchDB และฉันกำลังพยายามใช้รูปแบบการกำหนดเวอร์ชันเอกสาร วิธีที่ฉันเห็นมันมีสองวิธีในการทำสิ่งนี้:

  1. จัดเก็บแต่ละเวอร์ชันเป็นเอกสารแยกต่างหาก
  2. เก็บเวอร์ชันเก่าเป็นสิ่งที่แนบมากับเอกสารฉบับเดียว

ตอนนี้ฉันมีรูปแบบการทำงาน # 1 เมื่อผู้ใช้แก้ไขเอกสารและบันทึกไว้แบ็คเอนด์ก่อนจะคัดลอกการแก้ไขก่อนหน้านี้ไปยังเอกสารใหม่จากนั้นบันทึกเวอร์ชันใหม่ แต่ละเอกสารมีอาร์เรย์ 'ประวัติ' ที่มีข้อมูลในแต่ละเวอร์ชัน (เอกสาร _id ของเวอร์ชันเก่าการประทับเวลาตัวแก้ไข ฯลฯ )

เนื่องจากอาร์เรย์ประวัตินี้อาจมีความยาวค่อนข้างมากสำหรับเอกสารที่อัปเดตบ่อยครั้งฉันจึงมีมุมมองที่ดึงข้อมูลประวัติเอกสารในระหว่างการอ่านปกติ (และอีกมุมมองหนึ่งสำหรับดึงข้อมูลประวัติ)

คำถามของฉันคือ: ฉันรู้สึกไม่สบายใจเกี่ยวกับวิธีการปัจจุบันของฉันและกำลังคิดที่จะเปลี่ยนเป็นวิธีการ 'แนบ' แต่ฉันไม่แน่ใจ. ฉันหวังว่าคนที่รู้จัก CouchDB ดีกว่าฉัน (ฉันเพิ่งมาที่นี่แค่สองสามสัปดาห์ - และนี่เป็นโครงการแรกของฉันที่ใช้ CouchDB ... และ NoSQL) สามารถบอกได้ว่าข้อดีข้อเสียของแต่ละคน เข้าใกล้ หรืออาจมีโครงร่างเวอร์ชันอื่นที่ฉันมองเห็น


2
ในขณะที่ฉันไม่สามารถพูดถึงผลกระทบต่อประสิทธิภาพได้ทั้งหมดระบบที่คุณใช้คือ "จิตวิญญาณ" สอดคล้องกับ CouchDB การจัดเก็บเวอร์ชันก่อนหน้านี้เป็นลำดับชั้นการตอบสนองนั้นเป็นไปในทางที่ผิดเพราะมันอยู่ใน "บรรพบุรุษทางจิตวิญญาณ" ของ CouchDB ฐานข้อมูลเอกสารของ Lotus Notes (NSF) (Damien Katz ทำงานอย่างล้ำลึกก่อนที่จะพัฒนาอย่างอื่น ในขณะที่โยน cruft และย้อนกลับ / bugward ต้องการความเข้ากันได้ดังนั้นหลายคำถามที่โครงสร้างพื้นฐานเพิ่มเติมจะมีคำตอบในหมายเหตุ).

คำตอบ:


2

การจัดเก็บการเปลี่ยนแปลงเท่านั้นจะเป็นความคิดที่ดีเนื่องจากการจัดเก็บเอกสารเก่าเป็นเอกสารแยกต่างหากหรือสิ่งที่แนบมากับการแก้ไขฐานข้อมูลครั้งสุดท้ายจะสร้างโอเวอร์เฮดไปยังเซิร์ฟเวอร์ฐานข้อมูล

_h_i_s_<key_name>เมื่อคุณเคยเปลี่ยนค่าคีย์ในเอกสารของคุณเพิ่มคีย์ใหม่ที่ชื่อว่า ในการสร้างขึ้นใหม่ (หรือสร้างขึ้นในระหว่างการอัพเดทครั้งล่าสุด) ผนวกวัตถุเช่นด้านล่างหลังจากแก้ไข / ปรับปรุงทุกครั้ง: -

{
key_name: "Hello",
_h_i_s_key_name:{time_of_update:value_of_key_name_before_update},
....
}

หรือ

    {
    key_name: "Hello",
    _h_i_s_key_name:[{time:time_of_update,value:value_of_key_name_before_update}, {time:time_of_last_update,value:value_of_key_name_before_last_update}],
    ....
    }

วิธีนี้จะช่วยประหยัดพื้นที่ดิสก์และแบนด์วิดธ์การจำลองแบบได้ในระยะยาว


0

ไม่มีความรู้เกี่ยวกับ CouchDB การจัดเก็บทุกรุ่น แต่อาจแตกต่างจากรุ่นก่อนเท่านั้นคือเปลืองพื้นที่จัดเก็บ ฉันขอแนะนำให้เก็บการเปลี่ยนแปลงเท่านั้น

คุณอาจต้องการดูที่นี่หรือค้นหาการกำหนดเวอร์ชันของข้อมูล


คำตอบนี้ไม่สามารถบอกได้ว่าตัวเลือกใด 1 (แยกเอกสาร) หรือ 2 (เป็นส่วนหนึ่งของเอกสาร) จะดีกว่า
binki

0

ปีต่อมา ;-)

คุณไม่ต้องจัดเก็บการเปลี่ยนแปลงเพราะ CouchDB จะทำเพื่อคุณ หากเอกสารมีการเปลี่ยนแปลงการแก้ไขใหม่จะถูกสร้างขึ้น โปรดทราบว่านี่เป็นเอกสารอีกฉบับที่เหมือนกัน_idแต่เป็นฉบับใหม่_rev(ฉบับปรับปรุง) และจะใช้เนื้อที่ในดิสก์ของคุณ

แน่นอนว่าคุณจะต้องแก้ไขทุกอย่างว่าคุณต้องการดิสก์ที่มีขนาดใหญ่มาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.