ডাটাবেসে একটি সারির প্রতিটি পরিবর্তনের রেকর্ডিং কীভাবে উত্পন্ন হয়?


10

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

অনুরূপ জিনিস স্ট্যাক এক্সচেঞ্জ দ্বারা উদাহরণস্বরূপ ব্যবহৃত হয়। আমি যখন অন্য কারও প্রশ্ন পরিবর্তন করি, তখন এটি খুঁজে পাওয়া যায় এবং পরিবর্তনগুলি রোলব্যাক করা সম্ভব হয়।

আমার বর্তমান স্কীমার বেশিরভাগই একই বৈশিষ্ট্য (নীচে) গড়ে ওঠা একটি গড় ব্যবসায়িক অ্যাপ্লিকেশনটি দেওয়া একটি ডাটাবেসে কোনও সামগ্রীর প্রতিটি পরিবর্তন সংরক্ষণ করার জন্য ব্যবহৃত সাধারণ কৌশলটি কী ?

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

<TL-ড>

আমি নিম্নলিখিত কেসগুলি সম্পর্কে ভেবেছিলাম, তবে সেই ধরণের পরিস্থিতিতে আমার কোনও বাস্তব অভিজ্ঞতা নেই, তাই আমি অন্যের মতামত শুনব:

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

  2. এক সারণীতে সর্বশেষতম সংস্করণ সংরক্ষণ করুন এবং প্রতিটি পরিবর্তনে অপ্রচলিত সংস্করণটিকে অন্য স্কিমাতে অন্য টেবিলের অনুলিপি করুন। ত্রুটিটি হ'ল প্রতিবার, আমরা প্রতিটি মান সংরক্ষণ করি, এমনকি যদি এটি পরিবর্তন না হয়। অপরিবর্তিত মানগুলিকে সেট করা nullকোনও সমাধান নয়, যেহেতু যখন মানটি পরিবর্তন হয় nullবা এ থেকে হয় তখন আমাকেও ট্র্যাক করতে হবে null

  3. এক সারণীতে সর্বশেষতম সংস্করণ এবং অন্য সারণীতে পূর্বের মানগুলির সাথে পরিবর্তিত বৈশিষ্ট্যের তালিকা সংরক্ষণ করুন। একটি আছে হয় সবচেয়ে গুরুত্বপূর্ণ এক যে একমাত্র উপায় পূর্ববর্তী মূল্যবোধের ভিন্নধর্মী ধরনের সাজাতে একই কলাম রয়েছে: এই দুটি সংক্রান্ত ত্রুটিগুলি থাকার মনে হয় binary(max)। দ্বিতীয়টিটি হ'ল এটি আমার বিশ্বাস, ব্যবহারকারীর কাছে পূর্ববর্তী সংস্করণগুলি প্রদর্শন করার সময় এই জাতীয় কাঠামোটি ব্যবহার করা আরও কঠিন।

  4. আগের দুটি পয়েন্টের মতো একই কাজ করুন তবে সংস্করণগুলি পৃথক ডাটাবেসে সংরক্ষণ করুন store পারফরম্যান্স অনুসারে, একই ডাটাবেসে পূর্ববর্তী সংস্করণগুলি রেখে সর্বশেষ সংস্করণগুলিতে অ্যাক্সেস কমিয়ে দেওয়া এড়াতে এটি আকর্ষণীয় হতে পারে; তবুও, আমি বিশ্বাস করি যে এটি একটি অকালীন অপটিমাইজেশন এবং যদি কেবল একই ডাটাবেসে পুরানো এবং সর্বশেষ সংস্করণ থাকা বাধা হবার প্রমাণ থাকে তবেই তা করতে হবে।

</ TL-ড>


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

Frequently তথ্যগুলি খুব ঘন ঘন এবং কেবলমাত্র ব্যবহারকারীদের নির্দিষ্ট গোষ্ঠী দ্বারা অ্যাক্সেস করা হয় না, তবে তবুও সংস্করণগুলির তালিকার জন্য 30 সেকেন্ড অপেক্ষা করার জন্য তাদের বাধ্য করা অগ্রহণযোগ্য হবে। আবার কয়েক সেকেন্ড বিলম্ব গ্রহণযোগ্য।


3
প্রাসঙ্গিক: এসকিউএল সার্ভার পরিবর্তন ডেটা ক্যাপচার
নিক চ্যামাস

উত্তর:


8

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

টেবিলগুলিতে আপনার মূল টেবিলের মতো প্রায় একই কাঠামো থাকবে তবে পরিবর্তনটি কখন সংঘটিত হয়েছিল, সারিটি changedোকানো, পরিবর্তন করা বা মুছে ফেলা হয়েছে তার চিহ্নিতকরণের জন্য একটি ডেটটাইম কলাম থাকবে। সংস্করণগুলি সিকোয়েন্স করা সময় স্ট্যাম্পের মাধ্যমে করা যেতে পারে।

পরিবর্তনের তারিখটি ডেটটাইম কলামটি গেটডেট () এর ডিফল্ট দিয়ে বাতিল না করেই করা যেতে পারে; একটি নিরীক্ষণ ব্যবহারকারী কলামটি Suser_Sname () এ ডিফল্ট একটি নাল কলাম দিয়ে ব্যবহারকারীকে ক্যাপচার করবে। ধরে নিই যে আসল ব্যবহারকারীর অধিবেশন করা হচ্ছে এটি ব্যবহারকারীর পরিচয়টি পরিবর্তন করে।

ডাটাবেসের কোনও ওয়েব সার্ভারের সাথে সংযোগ যুক্ত আইপি ঠিকানা সম্পর্কে সচেতন হওয়ার কোনও উপায় নেই। অ্যাপ্লিকেশনটি লেনদেনের সাথে স্পষ্টভাবে আইপি ঠিকানা ক্যাপচার এবং লগ করতে হবে।

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

বেশ কয়েকটি কারণে এই সমাধানটি এখন পর্যন্ত সেরা:

  • এটি টেবিলে কোনও পরিবর্তন ক্যাপচার করে, কেবল অ্যাপ্লিকেশন দ্বারা তৈরি করা নয়।

  • আপনার প্রাথমিক টেবিলগুলিতে আই / ও বোঝা কমাতে নিরীক্ষার টেবিলগুলিকে আলাদা আলাদা ডিস্কে স্থাপন করা যেতে পারে।

  • আপনি সারণী এবং অডিট লগ টেবিলের ইউনিয়নের উপর ভিত্তি করে একটি দৃশ্য ব্যবহার করতে পারেন যা বর্তমান সংস্করণ সহ পুরো ইতিহাস দেখায়।

  • আপনি নিরীক্ষা লগ টেবিলগুলি প্রয়োজনীয় হিসাবে সূচক করতে পারেন যাতে নিরীক্ষার ব্যবহারকারীরা তাদের প্রতিক্রিয়াজনকভাবে জিজ্ঞাসা করতে পারে। যথারীতি, সূচি নির্বাচন ক্যোরি পারফরম্যান্স এবং আপডেট ওভারহেডের মধ্যে একটি বাণিজ্য is


আপনি যদি বলার চেষ্টা করেন যে আমার যদি 1000 টেবিল থাকে তবে আমার যে কোনও পরিবর্তনের জন্য লগ বজায় রাখা দরকার তবে আমাকে 1000 ছায়া টেবিল হু তৈরি করতে হবে? এবং পরিবর্তন ক্যাপচার জন্য 1000 ট্রিগার? যদি হ্যাঁ হয় তবে এটি বোগাস ধারণা ... পরিবর্তিত ডেটা ক্যাপচার এবং লগ করতে আমরা একক ইতিহাসের সারণী এবং একক ট্রিগার তৈরি করতে পারি। আমরা সেই টেবিলটিতে একটি এক্সএমএল হিসাবে পুরানো এবং নতুন সারি ডেটা সংরক্ষণ করতে পারি .... যা অনেকেই করেন .... আমি কি পরিষ্কার!
থমাস

1
1000 টি টেবিলের জন্য আপনি একটি উত্স লিখবেন যা সিস্টেমের ডেটা অভিধান থেকে সংজ্ঞাগুলি পড়ে এবং ট্রিগার এবং সারণী সংজ্ঞা উত্পন্ন করে। আমি এটি 560 টেবিল সহ একটি সিস্টেমে করেছি এবং এটি ঠিক কাজ করে।
কনসার্নড

0

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

এছাড়াও, প্রতিটি সারিতে রেকর্ডের সংখ্যা এবং সংশোধনীগুলির সংখ্যা আপনার সিদ্ধান্তে গুরুত্বপূর্ণ ভূমিকা নেবে।


0

সিএমএস সংস্করণ সম্পর্কে; ড্রুপালের জন্য এটি সত্তার প্রতিটি ক্ষেত্রের জন্য একটি বিশেষ টেবিল তৈরি করে যা পুরানো মূল্য সঞ্চয় করে; এই জাতীয় ধারণাটি আপনাকে আপনার ডেটাগুলির সূক্ষ্ম ম্যানিপুলেশনকে সজ্জিত করে তবে আমি মনে করি এটি ব্যয়বহুল, আমার নিজস্ব সমাধান হ'ল আমার অবজেক্টকে এক্সএমএল ফর্ম্যাটে রূপান্তর করা এবং অন্যান্য ক্ষেত্রগুলির সাথে স্ট্রিং হিসাবে সংরক্ষণ করা (পরিবর্তনকাল, আইডি ...)

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