চেঞ্জলগ / অডিটিং ডাটাবেস টেবিলের জন্য সেরা ডিজাইন? [বন্ধ]


114

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

  • আইডি (ইভেন্টের জন্য)
  • ব্যবহারকারী যে এটি ট্রিগার
  • অনুষ্ঠানের নাম
  • ঘটনা বিবরণী
  • অনুষ্ঠানের টাইমস্ট্যাম্প

আমি কি এখানে কিছু মিস করছি? স্পষ্টতই আমি ডিজাইনের উন্নতি চালিয়ে যেতে পারি, যদিও আমি এটিকে জটিল করে তোলার বিষয়ে পরিকল্পনা করি না (ইভেন্টের ধরণের জন্য বা অন্যান্য টেবিল তৈরি করা যেমন বিষয়টির বাইরে আসে না কেননা এটি আমার প্রয়োজনীয়তার জন্য জটিল)।


আমি আপনার উত্তরটি পড়েছি এবং আমি অবাক হয়ে কেউ আইন সম্পর্কে কথা বলে না। আমি জানি যে কিছু আইন বা ভাল প্রাইটিস ডকুমেন্টগুলি ব্যাখ্যা করে যে কীভাবে আমাদের একটি (কেবল পঠনযোগ্য) অডিট টেবিলটি প্রয়োগ করা উচিত। তবে এর চেয়ে বেশি তথ্য আমার কাছে নেই। আমি জানি যে এটি বিদ্যমান। আমি সিএফআর 21 অংশ 11 এ অডিট ট্রেইল সম্পর্কে ভাবছি
বাসটিয়েন ভান্ডামমে

12
সম্ভবত দরকারী: ludwigstuyck.wordpress.com/2013/04/04/ ইতিহাস
-

উত্তর:


69

যে প্রকল্পে আমি কাজ করছি, অডিট লগটিও আপনি বর্ণিত একটির মতো খুব সংক্ষিপ্ত নকশা থেকে শুরু করেছিলেন:

event ID
event date/time
event type
user ID
description

ধারণাটি একই ছিল: জিনিসগুলি সহজ রাখতে।

তবে এটি দ্রুত স্পষ্ট হয়ে উঠল যে এই নমনীয় নকশাটি পর্যাপ্ত ছিল না। টিপিক্যাল অডিট এই জাতীয় প্রশ্নের উদ্রেক করে:

Who the heck created/updated/deleted a record 
with ID=X in the table Foo and when?

সুতরাং, এই জাতীয় প্রশ্নের দ্রুত উত্তর দিতে সক্ষম হবার জন্য (এসকিউএল ব্যবহার করে), আমাদের অডিট টেবিলটিতে দুটি অতিরিক্ত কলাম রয়েছে

object type (or table name)
object ID

আমাদের অডিট লগের ডিজাইন সত্যিই স্থিতিশীল হয়ে উঠল (এখন কয়েক বছরের জন্য)।

অবশ্যই, সর্বশেষ "উন্নতি" কেবলমাত্র টেবিলগুলির জন্য কাজ করবে যেগুলি সরোগেট কী ছিল। কিন্তু অনুমান করতে পার কি? আমাদের সমস্ত টেবিলগুলি যা নিরীক্ষণের জন্য উপযুক্ত তা কী আছে!


এই নকশায় ('বর্ণন'-ভিত্তিক নিরীক্ষণের ট্রেইল) নিয়ে আমার একমাত্র সমস্যাটি সেই ক্ষেত্রটিতে ব্যবহৃত ভাষা স্থানীয়করণের সাথে সম্পর্কিত।
স্যাম উইলসন

@ সাম আমি এই জাতীয় সমস্যা দেখছি না, যদি বার্তাটি সিস্টেম উত্পন্ন হয় তবে অনুবাদ স্ট্রিংয়ের জন্য এখানে একটি কী ব্যবহার করুন;
জিসিএম

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

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

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

24

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

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


1
এটি সত্যিই ভাল people লোকেরা কেন সর্বশেষ পোস্টগুলিকে উপেক্ষা করে তা আমি বুঝতে পারি না।
ম্যাডি.শিক

3
ইতিহাস বজায় রেখে রোল-ব্যাক কার্যকারিতা সরবরাহ করার জন্য ইভেন্ট সোর্সিং বিকল্প বিকল্প।
স্যাম

23

আরও অনেকগুলি বিষয় রয়েছে যা আপনি নিরীক্ষণ করতে চাইতে পারেন যেমন টেবিল / কলামের নাম, কম্পিউটার / অ্যাপ্লিকেশন যা থেকে একটি আপডেট করা হয়েছিল এবং আরও অনেক কিছু।

এখন, এটি আপনার কীভাবে বিশদ নিরীক্ষণ করতে হবে এবং কী স্তরে প্রয়োজন তা নির্ভর করে।

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

পরামর্শ:

  • মানগুলির আগে / পরে অন্তর্ভুক্ত করুন

  • প্রাথমিক কী সংরক্ষণের জন্য 3-4 কলাম অন্তর্ভুক্ত করুন (এটি কোনও সংমিশ্রিত কী এর ক্ষেত্রে)

  • ইতিমধ্যে রবার্টের পরামর্শ অনুসারে মূল ডাটাবেসের বাইরে ডেটা সঞ্চয় করুন

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

  • হোস্ট / অ্যাপ্লিকেশন নাম সংরক্ষণের পরিকল্পনা - সন্দেহজনক ক্রিয়াকলাপ ট্র্যাক করার জন্য এটি খুব কার্যকর হতে পারে


2
কেন আপনি এটি কেনার পরিবর্তে প্রকৌশলীকে বিপরীত করবেন?
জোয়ান

1
পণ্যের উপর আরও নিয়ন্ত্রণ
টেবে

1
আশা করি তারা আপনাকে মামলা করেনি।
নির্বাচক

9

এখানে এবং অনুরূপ প্রশ্নগুলিতে অনেক আকর্ষণীয় উত্তর রয়েছে। ব্যক্তিগত অভিজ্ঞতা থেকে আমি কেবল যুক্ত করতে পারি:

  1. আপনার অডিট টেবিলটি অন্য একটি ডাটাবেসে রাখুন। আদর্শভাবে, আপনি মূল ডেটা থেকে পৃথকীকরণ চান। আপনার যদি আপনার ডাটাবেসটি পুনরুদ্ধার করতে হয় তবে আপনি সত্যিই নিরীক্ষার ট্রেইলটি পুনরুদ্ধার করতে চান না।

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


8
উপযুক্ত সূচকগুলির সাথে স্বাভাবিক করা ডেটার তুলনায় অযৌক্তিক উপাত্তগুলি পড়া কি সত্যিই দ্রুত হবে? (এইচডিডি থেকে আরও ডেটা পড়ার ফলে সমস্ত অনুলিপি হবে না?)
স্যাম

4

আমাদের টেবিলে যা আছে:

Primary Key
Event type (e.g. "UPDATED", "APPROVED")
Description ("Frisbar was added to blong")
User Id
User Id of second authoriser
Amount
Date/time
Generic Id
Table Name

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


2
"পরিমাণ" কী উপস্থাপন করে?
টারডুস-মেরুলা

এটি একটি আর্থিক প্রয়োগ, সুতরাং এটি অনুমোদিত হওয়ার মতো জিনিসটির ডলারের মূল্য ইত্যাদি
W

4

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


3

এটি করার অনেকগুলি উপায় রয়েছে। আমার প্রিয় উপায়টি হ'ল:

  1. mod_userআপনার উত্স সারণীতে একটি ক্ষেত্র যুক্ত করুন (আপনি যেটিকে লগ করতে চান)।

  2. লগ টেবিল তৈরি করুন যাতে আপনি লগ করতে চান এমন ক্ষেত্রগুলি, এবং আরও log_datetimeএবং seq_numক্ষেত্র অন্তর্ভুক্ত থাকে। seq_numপ্রাথমিক কী।

  3. উত্স সারণীতে এমন একটি ট্রিগার তৈরি করুন যা লগ টেবিলটিতে বর্তমান রেকর্ড সন্নিবেশ করে যখনই কোনও নিরীক্ষিত ক্ষেত্র পরিবর্তন হয়।

এখন আপনি প্রতিটি পরিবর্তনের রেকর্ড পেয়েছেন এবং কে এটি করেছেন।


সুতরাং ... মোড_উজার ফিল্ডটি কী করার কথা?
কনিকে

1
আপনাকে বলুন কে পরিবর্তন করেছে। হালনাগাদ কোডটিতে বর্তমান ব্যবহারকারীকে সেই ক্ষেত্রটি সেট করার জন্য কিছু অন্তর্ভুক্ত করা উচিত।
জোসেফস্টাইন্স

মুছে ফেলা সম্পর্কে কি? আপনি যদি একটি সারি মুছে ফেলেন তবে আপনি Mod_user কলামের মানটি কীভাবে পরিচালনা করবেন?
কেন Cal

@ কেনালকল ট্রিগাররা ভার্চুয়াল টেবিলগুলি ব্যবহার করতে পারে, আপনি একই ট্রিগারটির পরে এবং তার আগেও ডেটা দেখতে পারবেন। অপারেশন কোন ব্যাপার না। stackoverflow.com/questions/6282618/…
রেনান ক্যাভালিরি

2
@ কেন্নকাল আপনি সঠিক, মুছে ফেলার ট্রিগারটি আপনার জন্য সেই তথ্য সংরক্ষণ করতে হবে। শয়তান যদিও বিশদে রয়েছে - আপনি যদি এসকিউএল প্রমাণীকরণ ব্যবহার করেন তবে ট্রিগারটি কেবল চালাতে পারে [CURRENT_USER নির্বাচন করুন]। যদি এটি একটি ক্লায়েন্ট অ্যাপ্লিকেশন হয়, তবে ক্লায়েন্ট কোডটি এটি কে তা ঘোষণা করা দরকার। যদি এটি একটি এপিআই কল হয় তবে মুছে ফেলা ব্যবহারকারীকে কলটিতে প্রয়োজনীয় প্যারামিটার হওয়া দরকার।
জোসেফস্টাইন্স

1

বিচ্ছেদ নীতি অনুসারে:

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

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

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