কোনও মাইএসকিউএল ডাটাবেসে রিলেশনাল ডেটা সংস্করণ করার জন্য প্যাটার্নস?


12

আমি একটি প্রকল্পের জন্য একটি পদ্ধতির সন্ধান করার চেষ্টা করছি, যেখানে কোনও ব্যবহারকারী রেকর্ড সম্পাদনা করতে পারে এবং সেই রেকর্ডগুলির অতীতের সংস্করণগুলি দেখতে সক্ষম হয়। এখানে একটি তালিকা ব্যবহার করে একটি সিমিফায়েড উদাহরণ স্কিমা দেওয়া হয়েছে:

TABLE list (
  id int auto_increment primary key,
  user_id int, 
  title varchar(255)
);

TABLE list_tasks (
  id int auto_increment primary key,
  list_id int,
  title varchar(255),
  order int,
  is_complete tinyint
);

সুতরাং কোনও ব্যবহারকারী প্রবেশ করতে পারে এবং তালিকায় একাধিক সম্পাদনা করতে পারে, (যেমন, কাজগুলি যুক্ত বা সরিয়ে, পুনরায় অর্ডার টাস্ক, কিছু সম্পূর্ণ চিহ্নিত করে, কিছুটির পুনরায় নামকরণ ইত্যাদি), তারপরে সেভ করুন। এই মুহুর্তে, আমি তালিকা এবং কার্যগুলির একটি 'সংস্করণ 2' উত্পন্ন করতে চাই এবং তাদের পূর্ববর্তী সংস্করণগুলি দেখতে সক্ষম হতে চাই, তবে যখন তারা তালিকায় প্রবেশ করে, সর্বদা সর্বশেষতম সংস্করণটি পায় get

কোনও মাইএসকিউএল ডাটাবেসে এইভাবে সংস্করণ ডেটা ব্যবহার করার জন্য কি সাধারণ পন্থা / ডিজাইনের প্যাটার্ন রয়েছে?


মনে রাখবেন যে তারা এটির জন্য লাইব্রেরি। উদাহরণস্বরূপ আপনি যদি হাইবারনেট ব্যবহার করেন তবে হাইবারনেট এনভার্স রয়েছে। সুতরাং আপনার জন্য ডিএও পরিচালনা করার জন্য যদি কিছু ফ্রেমওয়ার্ক থাকে তবে এর মতো কিছু আছে কিনা তা অনুসন্ধান করার চেষ্টা করুন।
ওয়ালফ্র্যাট

উত্তর:


9

এটি একটি ডিবিতে করতে চাওয়া খুব সাধারণ। যদিও আপনি এটিতে একটি বাঁক দিচ্ছেন আপনি আইটেমের তালিকার জন্য একটি সংশোধন ট্র্যাক করতে চান।

এটি করার একটি উপায় হতে পারে যেমন কাঠামো পরিবর্তন করা

Alter table lists add revision_id integer;
Alter table list_tasks add revision_id integer;

Create Table revisions
{
   id int autoincrement... (revision id)
   list_id int...
   revdate datetime...
}

যখন ব্যবহারকারী তাদের তালিকাটি সংরক্ষণ করে, revisionsউপরের সারণিতে একটি নতুন সংশোধন তৈরি করুন এবং তালিকাটিকে আইটেমটিতে list_tasksএবং তারপরে সেই আইডিটিকে lists'বর্তমান' সংশোধন হিসাবে চিহ্নিত করতে সেই মানটি নির্ধারণ করুন । যখন ব্যবহারকারী আইটেমগুলি সম্পাদনা করেন, বিদ্যমান আইটেমগুলিতে সম্পাদনা করবেন না - বরং একটি নতুন সংশোধন আইডি সহ নতুনগুলি সন্নিবেশ করুন listএবং বর্তমানটিকে চিহ্নিত হিসাবে সেই সংশোধন সহ টেবিলটি আপডেট করুন ।

তারপরে বর্তমান আইটেমগুলির তালিকা করতে, listsসারণীতে নির্দিষ্ট করা বর্তমান সংশোধন আইডি থেকে আইটেমগুলি তালিকাবদ্ধ করুন। পূর্ববর্তী সংস্করণগুলি ব্রাউজ করতে, আপনি সংশোধন টেবিল থেকে তালিকার পূর্ববর্তী রিভিজনগুলির একটি তালিকা পেতে পারেন এবং তারপরে সেই আইডির ভিত্তিতে পৃথক আইটেমগুলি তালিকাভুক্ত করতে পারেন।


5

এই সমাধানটিতে একটি পৃথক অডিটিং টেবিল ব্যবহার করা হয়। এটির পক্ষে মতামত রয়েছে। আপনি আপনার প্রধান সারণী থেকে পুরানো রেকর্ডগুলি অপসারণ করতে পছন্দ করতে পারেন। পারফরম্যান্সের উন্নতি নগণ্য হতে পারে।

প্রতিটি নিরীক্ষিত সারণীতে নিম্নলিখিত ক্ষেত্রগুলি যুক্ত করুন:

AddUserID      int <whatever your system uses>
AddDateTime    datetime
UpdateUserID   int <whatever your system uses>
UpdateDateTime datetime
CurrentVersion int
IsDeleted      bit

প্রতিবার ডেটা পরিবর্তনের সময় আপনাকে এই ক্ষেত্রগুলি আপডেট করতে হবে। কারেন্ট ভার্সনটি 1 দ্বারা বৃদ্ধি পেয়েছে (এটি কোনও রেকর্ড লক করার উপায় হিসাবে ব্যবহার করা যেতে পারে তবে এটি অন্য প্রশ্ন)

পৃথক নিরীক্ষণ সারণী প্রতিটি সারণির সারণির একটি যথাযথ _আর্কাইভ বা _ _ ইতিহাস সংস্করণ থাকা উচিত। এগুলি সম্ভবত একইভাবে সূচকের প্রয়োজন হয় না। অবশ্যই একক প্রাথমিক কী ক্ষেত্র প্রয়োগ হবে না apply আপনার আইডি ক্ষেত্র এবং আপডেটডেটটাইম থেকে একটি সমন্বিত কী তৈরি করতে সক্ষম হওয়া উচিত।

একটি ট্রিগার ব্যবহার করে (এটি আপনার কোডের অভ্যন্তরে বা বাইরে করা পরিবর্তনগুলি সম্বোধন করবে this এটি আপনার অবস্থার জন্য কাজ করে কিনা তা আপনি সিদ্ধান্ত নিতে পারেন)) বা অন্যান্য কোডিং, যখন কোনও রেকর্ড সংযোজন, আপডেট করা বা মোছা হয়, তখন রেকর্ডের একটি অনুলিপি সংরক্ষণাগারে রাখা হয় / ইতিহাস সারণী। সংস্করণ এবং অন্যান্য নিরীক্ষণ ক্ষেত্রগুলির সমস্ত রক্ষণাবেক্ষণ করা হয়। এটি আপনাকে বলবে যে ব্যবহারকারীরা কখন কী করেছিল। কখন কোনও রেকর্ড পরিবর্তন হয়েছিল বা প্রবণতাগুলি দেখতে টেবিলটি নিজের সাথে তুলনা করা যেতে পারে।

আমি গত কয়েক বছর ধরে এই কাজটি ভাল করে দেখেছি। আমি যে অপূর্ণতাগুলি বিবেচনা করছি না সে সম্পর্কে শুনতে চাই।


আমি গ্র্যান্ডমাস্টারবি'র পাশাপাশি এটিও উত্সাহিত করছি, দুটোই ভাল এবং কোনটি ব্যবহার করা হবে তা নির্দিষ্ট প্রয়োজনীয়তার উপর আরও বিশদের উপর নির্ভর করে।
জঙ্কি

-2

আমি আপনাকে এই ভাল বিস্তারিত নিবন্ধ পড়ার পরামর্শ দিচ্ছি।

https://blog.jondh.me.uk/2011/11/relational-database-versioning-strategies/comment-page-1/#comment-373850

অন্য পদ্ধতিরটি হ'ল আপনার টেবিলের একটি সংস্করণ_আইডি কলাম এবং একটি 'বর্তমান' পতাকা যা কোন সারিটি বর্তমান তা সুনির্দিষ্ট করে। প্রতিবার যখন আপনাকে একটি আপডেটের প্রয়োজন হয়, আপনি একটি নতুন সারি sertোকাতে এবং বিদ্যমান সংস্করণ 'বর্তমান' পতাকাটি 0 / মিথ্যাতে এবং নতুন যুক্ত করা সারিটি 1 এ সেট করতে পারেন।

এইভাবে আপনি কেবলমাত্র বর্তমান পতাকা সেট সহ এমন একটি ভিউ তৈরি করতে পারবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.