เป็นคำถามที่ดีฉันกำลังมองหาสิ่งนี้ด้วยตัวเองเช่นกัน
สร้างเวอร์ชันใหม่สำหรับการเปลี่ยนแปลงแต่ละครั้ง
ฉันเจอโมดูล Versioningของไดรเวอร์ Mongoid สำหรับ Ruby ฉันไม่ได้ใช้มันเอง แต่จากสิ่งที่ฉันหาได้มันเพิ่มหมายเลขเวอร์ชันให้กับเอกสารแต่ละฉบับ เวอร์ชันเก่าจะฝังอยู่ในเอกสาร ข้อเสียเปรียบที่สำคัญคือเอกสารทั้งหมดจะซ้ำกันในการเปลี่ยนแปลงแต่ละครั้งซึ่งจะส่งผลให้มีการจัดเก็บเนื้อหาที่ซ้ำกันจำนวนมากเมื่อคุณจัดการกับเอกสารขนาดใหญ่ วิธีนี้ใช้ได้ดีแม้ว่าคุณจะจัดการกับเอกสารขนาดเล็กและ / หรือไม่ได้อัปเดตเอกสารบ่อยนัก
จัดเก็บเฉพาะการเปลี่ยนแปลงในเวอร์ชันใหม่
อีกวิธีหนึ่งที่จะเก็บเฉพาะสาขาที่มีการเปลี่ยนแปลงในเวอร์ชันใหม่ จากนั้นคุณสามารถ "แบน" ประวัติของคุณเพื่อสร้างเอกสารเวอร์ชันใดก็ได้ สิ่งนี้ค่อนข้างซับซ้อนเนื่องจากคุณต้องติดตามการเปลี่ยนแปลงในโมเดลของคุณและจัดเก็บการอัปเดตและการลบเพื่อให้แอปพลิเคชันของคุณสามารถสร้างเอกสารที่เป็นปัจจุบันขึ้นมาใหม่ได้ อาจเป็นเรื่องยุ่งยากเนื่องจากคุณกำลังจัดการกับเอกสารที่มีโครงสร้างแทนที่จะเป็นตาราง SQL แบบแบน
จัดเก็บการเปลี่ยนแปลงภายในเอกสาร
แต่ละฟิลด์ยังสามารถมีประวัติส่วนตัว การสร้างเอกสารใหม่เป็นเวอร์ชันที่กำหนดนั้นง่ายกว่ามากด้วยวิธีนี้ ในแอปพลิเคชันของคุณคุณไม่จำเป็นต้องติดตามการเปลี่ยนแปลงอย่างชัดเจน แต่เพียงแค่สร้างคุณสมบัติเวอร์ชันใหม่เมื่อคุณเปลี่ยนค่า เอกสารอาจมีลักษณะดังนี้:
{
_id: "4c6b9456f61f000000007ba6"
title: [
{ version: 1, value: "Hello world" },
{ version: 6, value: "Foo" }
],
body: [
{ version: 1, value: "Is this thing on?" },
{ version: 2, value: "What should I write?" },
{ version: 6, value: "This is the new body" }
],
tags: [
{ version: 1, value: [ "test", "trivial" ] },
{ version: 6, value: [ "foo", "test" ] }
],
comments: [
{
author: "joe", // Unversioned field
body: [
{ version: 3, value: "Something cool" }
]
},
{
author: "xxx",
body: [
{ version: 4, value: "Spam" },
{ version: 5, deleted: true }
]
},
{
author: "jim",
body: [
{ version: 7, value: "Not bad" },
{ version: 8, value: "Not bad at all" }
]
}
]
}
การทำเครื่องหมายบางส่วนของเอกสารว่าถูกลบในเวอร์ชันยังค่อนข้างอึดอัด คุณสามารถแนะนำstate
ฟิลด์สำหรับชิ้นส่วนที่สามารถลบ / กู้คืนได้จากแอปพลิเคชันของคุณ:
{
author: "xxx",
body: [
{ version: 4, value: "Spam" }
],
state: [
{ version: 4, deleted: false },
{ version: 5, deleted: true }
]
}
ด้วยวิธีการเหล่านี้แต่ละวิธีคุณสามารถจัดเก็บเวอร์ชันที่ทันสมัยและแบนราบไว้ในคอลเลคชันเดียวและข้อมูลประวัติในคอลเลกชันแยกต่างหาก สิ่งนี้ควรปรับปรุงเวลาในการสืบค้นหากคุณสนใจเฉพาะเอกสารเวอร์ชันล่าสุด แต่เมื่อคุณต้องการทั้งเวอร์ชันล่าสุดและข้อมูลประวัติคุณจะต้องดำเนินการค้นหาสองครั้งแทนที่จะเป็นหนึ่งคำค้นหา ดังนั้นการเลือกใช้คอลเลกชั่นเดียวกับสองคอลเลกชันที่แยกจากกันควรขึ้นอยู่กับความถี่ที่แอปพลิเคชันของคุณต้องการเวอร์ชันที่ผ่านมา
คำตอบนี้ส่วนใหญ่เป็นเพียงการระบายความคิดของฉันฉันยังไม่ได้ลองทำอะไรเลย เมื่อมองย้อนกลับไปตัวเลือกแรกน่าจะเป็นทางออกที่ง่ายและดีที่สุดเว้นแต่ว่าข้อมูลที่ซ้ำกันจะมีความสำคัญมากสำหรับแอปพลิเคชันของคุณ ตัวเลือกที่สองค่อนข้างซับซ้อนและอาจไม่คุ้มกับความพยายาม ตัวเลือกที่สามโดยพื้นฐานแล้วเป็นการเพิ่มประสิทธิภาพของตัวเลือกที่สองและควรจะใช้งานได้ง่ายกว่า แต่อาจไม่คุ้มกับความพยายามในการนำไปใช้เว้นแต่คุณจะไม่สามารถใช้ตัวเลือกที่หนึ่งได้จริงๆ
รอข้อเสนอแนะเกี่ยวกับเรื่องนี้และแนวทางแก้ไขปัญหาของผู้อื่น :)