ডাটাবেস এন্ট্রি পরিবর্তনের ইতিহাস আছে উপায়


21

ডাটাবেস এন্ট্রি (ডেটা) এর সংস্করণ অনুমোদনের উপায়গুলি কী কী?

নিবন্ধগুলির পরিবর্তনগুলি ফিরিয়ে আনতে কন্টেন্ট-ম্যানেজমেন্ট-সিস্টেমের দক্ষতার কথা চিন্তা করুন।

তাদের পক্ষে কি ভাল?


1
আপনি ঠিক কি সংস্করণ করতে চান? স্কিমা নাকি ডেটা?
tmadmers

1
আমি ডেটা সংস্করণ করতে চাই। সিমসির উদাহরণে থাকতে, নিবন্ধগুলির সংস্করণগুলি বলতে দিন ।
ম্যাটকাঠন

আপনি ডেটামিকের দিকে নজর দিতে পারেন।
ড্যান_ওয়াটারওয়ার্থ

উত্তর:


19

মূলত দুটি পন্থা রয়েছে: একটি অডিট টেবিল, এতে পূর্ববর্তী সমস্ত মানগুলি সঞ্চিত থাকে বা সারণীর অংশ হিসাবে একটি সূচনা / শেষের তারিখ অন্তর্ভুক্ত করে এবং সমস্ত আপডেট পুরানোটিকে বন্ধ করে দেওয়ার সময় একটি নতুন রেকর্ড তৈরি করে।

আপডেট: এসকিউএল সার্ভার ২০১ এটিকে ডিজাইনের প্যাটার্ন / টেবিল প্রকার হিসাবে সমর্থন করে - https://docs.microsoft.com/en-us/sql/relational-datিয়া


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

1
এটি আপনার ব্যবহারের উপর নির্ভর করবে, টেবিল / গুলি জনসাধারণের জন্য ট্রিগারগুলি ব্যবহার করা এবং তারপরে কী এবং কতটা রোলব্যাক করতে হবে তা বাছাইয়ের উপায় সরবরাহ করা যথেষ্ট।
jmoreno

আপনার উত্তরে একটি টাইপো রয়েছে (প্যাটার প্যাটার্ন হওয়া উচিত)
জিওকোডিজিপ

7

একটি ধারণা হ'ল "সন্নিবেশ-কেবল ডাটাবেসগুলি" ব্যবহার করা। মূল ধারণাটি হ'ল আপনি কখনই কোনও সারিতে ডেটা মুছবেন না বা আপডেট করবেন না

প্রতিটি টেবিল যা ট্র্যাক করা প্রয়োজন সেখানে দুটি datetimeকলাম fromএবং থাকবে to। তারা NULLপ্রতিটি মান দিয়ে শুরু (সময়ের শেষ সময় শুরু)। আপনার যখন সারিটি "পরিবর্তন" করতে হবে তখন আপনি একটি নতুন সারি যুক্ত করবেন এবং একই সাথে আপনি toআগের সারিটিতে Nowএবং fromযে সারিতে আপনি যুক্ত করছেন তাতে আপডেট করুন Now

আরও বিস্তারিত তথ্যের জন্য এখানে দেখুন:

এই কৌশলটি AuditTrailলিগ্যাসির ডেটা পরিচালনা করার জন্য বলা হয় এবং এর কিন্ডার স্টোরগুলি ইতিহাস পরিবর্তন করে।

দেখে মনে হচ্ছে এই প্রকৃতির প্রশ্নটি ইতিমধ্যে পোস্ট করা হয়েছে:


দুঃখজনকভাবে এই প্রশ্নটি মুছে ফেলা হয়েছে বলে মনে হচ্ছে :(
ডগলাস গ্যাসকেল

কোনও সমস্যা নেই, এখানে লিঙ্কটিলিঙ্কে
ইউসুবভ

2

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

এই প্রক্রিয়াটি বড় প্রকল্পগুলির জন্যও কার্যকর। এই সারণীতে আপনি ব্যবহারকারীর তথ্য লগ করতে পারেন যারা পরিবর্তনের সময়-স্ট্যাম্পের সাথে পরিবর্তন করেছেন। তারপরে আপনি আপনার প্রয়োজনীয়তার সাথে মেলে এমন কোনও টাইম-স্ট্যাম্পের সাথে আপনার টেবিলটি পুনরুদ্ধার করতে পারেন।

প্রতিটি ডাটাবেসের নিজস্ব লেখার কোড এবং কোড ট্রিগার থাকে। যদি আপনি এসকিউএলাইট ব্যবহার করে থাকেন তবে সিনট্যাক্সের জন্য এসকিউএলটি.আর যান । অন্যান্য ডাটাবেসের জন্য আপনি তাদের অফিসিয়াল সাইটগুলি দেখতে পারেন।


1

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

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


আপনি কী ভাবেন যে এই পদ্ধতির বৃহত প্রকল্পগুলির জন্য মাপদণ্ডযোগ্য?
ম্যাটকাঠন

আমি মনে করি এটি বড় ডেটা পরিবর্তনের জন্য বৃহত্তর ডেটা ওভারহেড যুক্ত করতে পারে (স্পষ্টতই যেহেতু পরিবর্তিত প্রতিটি একক সংরক্ষণ করা উচিত, যদিও পুরানো সংস্করণের সংকোচন সাহায্য করতে পারে)। আপনার স্কিমার দিক থেকে এটি যতক্ষণ না এটি দুটি টেবিলের জন্য কাজ করে ততক্ষণ এটি বিশটির জন্য কাজ করে।
মাকসি

1

ডাটাবেস এন্ট্রিগুলির সংস্করণ করার জন্য আমরা যে পদ্ধতিটি ব্যবহার করি তা হ'ল অডিটিং টেবিলটি ব্যবহার করা। টেবিলে লাইন বরাবর একটি স্কিমা রয়েছে:

Seq      - Int      ' Unique identifier for this table
Event    - Char     ' Insert / Update / Delete
TblName  - Char     ' Table that had field value changed
FldName  - Char     ' Field that was changed
KeyValue - Char     ' delimited list of values for fields that make up the PK of table changed
UsrId    - Char     ' User who made the change
OldValue - Char     ' Old value (converted to character)
NewValue - Char     ' New value (converted to character)
AddTs    - DateTime ' When the change was made

এরপরে আমরা যে সারণীগুলি ট্র্যাক করতে চাই সেগুলি সন্নিবেশ / আপডেট / মুছতে ট্রিগার করেছি।

পেশাদাররা:

  • সমস্ত ডেটা এক টেবিলের মধ্যে রয়েছে
  • একটি সারণীতে সমস্ত ক্ষেত্র বা নির্দিষ্ট ক্ষেত্রগুলি ট্র্যাক করার জন্য সেটআপ করা যেতে পারে
  • একটি টেবিলের জন্য প্রতিটি ক্ষেত্রে সংস্করণ দেখানো সহজ

কনস:

  • এক টেবিলের সমস্ত অডিটিং তথ্য রাখার ফলে অত্যন্ত রেকর্ডের একটি বিশাল সংখ্যক ফলাফল হয়
  • প্রচুর ট্রিগার দরকার

0

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

তারপরে যদি আমার এমনকি জিজ্ঞাসা করার দরকার হয় তবে আমি কেবল রেকর্ডগুলি ফিরিয়ে দিতে ActiveRecord = trueপারি যেখানে এবং আমি কেবল সর্বাধিক টু ডেট তথ্য পেতে পারি।


ActiveRecordপতাকার দরকার নেই । MAX (*) সারিটি সর্বদা বর্তমান রেকর্ড হওয়া উচিত। পূর্ববর্তী সংস্করণে পুনরুদ্ধার করা সারণীতে আবার সারণিতে আবার সন্নিবেশ করানো হয়।
বিপরীতমুখী

নির্বাচিত কাজটি কীভাবে করা যায় তা সম্পর্কে আমি নিশ্চিত ছিলাম না, তবে এখন আপনি যখন এটিকে কল করছেন আমি এটি সম্পর্কে চিন্তাভাবনা করছি এবং একটি ধারণা পেয়েছি, হুম মিম
ব্র্যাড

সাধারণত MAX (কলাম_নাম) সারণীর কলামের বৃহত্তম মান নির্বাচন করে। পুরো সারিটি নির্বাচন করতে, একটি সাধারণ কাজ select top 1 order by id descendingকরবে।
বিপরীতমুখী

হ্যাঁ, এটি একটি সাধারণ একক রেকর্ডের জন্য কাজ করে তবে আমার টেবিলটি শিশু রেকর্ডগুলির একটি সংকলন ছিল যা একবারে বাছাই করা প্রয়োজন তবে পৃথকভাবে পরিবর্তিত হতে পারে। আরও কিছুটা জটিল।
ব্র্যাড

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