ভাল প্রশ্ন, আমি নিজেও এটিকে দেখছিলাম।
প্রতিটি পরিবর্তনের উপর একটি নতুন সংস্করণ তৈরি করুন
আমি রুবির জন্য মংগয়েড ড্রাইভারের সংস্করণ মডিউলটি পেরিয়ে এসেছি । আমি নিজে এটি ব্যবহার করি নি, তবে যা খুজে পেয়েছি তা থেকে এটি প্রতিটি নথিতে একটি সংস্করণ নম্বর যুক্ত করে। পুরানো সংস্করণগুলি নথিতেই এম্বেড করা আছে। প্রধান ত্রুটিটি হ'ল প্রতিটি নথির পুরো দস্তাবেজটি সদৃশ হয়ে যায় , যার ফলে আপনি যখন বড় দস্তাবেজগুলির সাথে লেনদেন করেন তখন প্রচুর নকল সামগ্রী সংরক্ষণ করা হয়। আপনি যখন ছোট আকারের নথিগুলি নিয়ে কাজ করছেন এবং / বা খুব ঘন ঘন দস্তাবেজগুলি আপডেট না করেন তবে এই পদ্ধতিটি ঠিক আছে।
কেবলমাত্র একটি নতুন সংস্করণে পরিবর্তনগুলি সংরক্ষণ করুন
অন্য পদ্ধতিটি হ'ল কেবলমাত্র পরিবর্তিত ক্ষেত্রগুলি একটি নতুন সংস্করণে সংরক্ষণ করা । তারপরে আপনি নথির যে কোনও সংস্করণ পুনর্গঠন করতে আপনার ইতিহাসকে 'সমতল' করতে পারেন। এটি বরং জটিল, কারণ আপনার মডেলটিতে পরিবর্তনগুলি ট্র্যাক করতে হবে এবং আপডেটগুলি এবং মুছতে হবে এমন উপায়ে যাতে আপনার অ্যাপ্লিকেশনটি আপ টু ডেট ডকুমেন্টটিকে পুনর্গঠন করতে পারে। এটি জটিল হতে পারে, কারণ আপনি ফ্ল্যাট এসকিউএল টেবিলের চেয়ে কাঠামোগত দস্তাবেজগুলির সাথে কাজ করছেন।
দস্তাবেজের মধ্যে পরিবর্তনগুলি সঞ্চয় করুন
প্রতিটি ক্ষেত্রে একটি পৃথক ইতিহাস থাকতে পারে। প্রদত্ত সংস্করণে দস্তাবেজগুলি পুনর্গঠন করা এইভাবে অনেক সহজ। আপনার আবেদনে আপনাকে স্পষ্টভাবে পরিবর্তনগুলি ট্র্যাক করতে হবে না, তবে আপনি যখন তার মান পরিবর্তন করবেন তখন কেবলমাত্র একটি নতুন সংস্করণ তৈরি করুন। একটি দস্তাবেজ এর মতো দেখতে পারে:
{
_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 }
]
}
এই প্রতিটি পদ্ধতির সাথে আপনি একটি সংকলনে একটি আধুনিক ও সমতল সংস্করণ এবং ইতিহাসের ডেটা পৃথক সংগ্রহে সংরক্ষণ করতে পারেন। যদি আপনি কেবল কোনও নথির সর্বশেষ সংস্করণে আগ্রহী হন তবে এটি ক্যোয়ারির সময়গুলি উন্নত করা উচিত। তবে যখন আপনার সর্বশেষতম সংস্করণ এবং historicalতিহাসিক ডেটা উভয়ের প্রয়োজন হবে, আপনার একটির পরিবর্তে দুটি ক্যোয়ারী করা উচিত। বনাম দুটি পৃথক সংগ্রহের একটি একক সংগ্রহে ব্যবহার নির্ভর করবে পছন্দমত তাই কত ঘন ঘন আপনার আবেদন ঐতিহাসিক সংস্করণ প্রয়োজন ।
এই উত্তরটির বেশিরভাগটি আমার চিন্তার একমাত্র মস্তিষ্কের ডাম্প, আমি আসলে এখনও এর কোনও চেষ্টা করি নি। এটির দিকে ফিরে তাকালে, প্রথম বিকল্পটি সম্ভবত সবচেয়ে সহজ এবং সর্বোত্তম সমাধান, যদি না ডুপ্লিকেট ডেটার ওভারহেড আপনার অ্যাপ্লিকেশনটির জন্য খুব তাৎপর্যপূর্ণ হয়। দ্বিতীয় বিকল্পটি বেশ জটিল এবং সম্ভবত চেষ্টা করার উপযুক্ত নয়। তৃতীয় বিকল্পটি মূলত বিকল্প দুটিটির একটি অপ্টিমাইজেশন এবং এটি কার্যকর করা সহজ হওয়া উচিত, তবে আপনি যদি সত্যিই অপশনটির সাথে না যেতে পারেন তবে সম্ভবত প্রয়োগের প্রচেষ্টাটি মূল্যবান নয়।
এই বিষয়ে প্রতিক্রিয়া এবং অন্যান্য লোকের সমস্যার সমাধানের জন্য অপেক্ষা করছি :)