রেকর্ডে পরিবর্তনের ইতিহাস ট্র্যাক করার জন্য কি কোনও মাইএসকিউএল বিকল্প / বৈশিষ্ট্য রয়েছে?


121

আমাকে জিজ্ঞাসা করা হয়েছে যে আমি কোনও মাইএসকিউএল ডাটাবেসে রেকর্ডগুলির পরিবর্তনগুলি ট্র্যাক রাখতে পারি কিনা। সুতরাং যখন কোনও ক্ষেত্র পরিবর্তন করা হয়েছে, তখন পুরানো বনাম নতুন উপলব্ধ এবং এটি সংঘটিত হওয়ার তারিখ। এটি করার কোনও বৈশিষ্ট্য বা সাধারণ কৌশল আছে কি?

যদি তাই হয় তবে আমি এই জাতীয় কিছু করার কথা ভাবছিলাম। বলা একটি টেবিল তৈরি করুন changes। এতে মাস্টার টেবিলের মতো একই ক্ষেত্র থাকবে তবে এটি পুরানো এবং নতুন সহ উপস্থাপিত হবে তবে কেবলমাত্র সেই ক্ষেত্রগুলির জন্য যা বাস্তবে পরিবর্তিত হয়েছিল এবং TIMESTAMPএটির জন্য একটি । এটি একটি সঙ্গে সূচিত হবে ID। এইভাবে, SELECTপ্রতিটি রেকর্ডের ইতিহাস দেখানোর জন্য একটি প্রতিবেদন চালানো যেতে পারে। এটি কি একটি ভাল পদ্ধতি? ধন্যবাদ!

উত্তর:


83

এটা সূক্ষ্ম।

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

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

পরিবর্তে, আপনি আপনার স্কিমা ডিজাইনে সময়ের সাথে পরিবর্তনের ধারণাটি বেক করতে পারেন (এটি দ্বিতীয় বিকল্প কীথানজান পরামর্শ দেয়)। এটি অবশ্যই আপনার ব্যবসায়ের যুক্তি এবং অধ্যবসায়ের স্তরে আপনার আবেদনের পরিবর্তন, সুতরাং এটি তুচ্ছ নয়।

উদাহরণস্বরূপ, আপনার যদি এই জাতীয় একটি টেবিল থাকে:

CUSTOMER
---------
CUSTOMER_ID PK
CUSTOMER_NAME
CUSTOMER_ADDRESS

এবং আপনি সময়ের সাথে সাথে নজর রাখতে চেয়েছিলেন, আপনি নিম্নলিখিত হিসাবে এটি সংশোধন করবেন:

CUSTOMER
------------
CUSTOMER_ID            PK
CUSTOMER_VALID_FROM    PK
CUSTOMER_VALID_UNTIL   PK
CUSTOMER_STATUS
CUSTOMER_USER
CUSTOMER_NAME
CUSTOMER_ADDRESS

প্রতিবার আপনি গ্রাহক রেকর্ড পরিবর্তন করতে চাইলে, রেকর্ডটি আপডেট করার পরিবর্তে আপনি এখনই রেকর্ডে VALID_UNTIL সেট করুন NOW () এ এবং একটি নতুন রেকর্ড একটি VALID_FROM (এখন) এবং একটি নাল VALID_UNTIL সহ সন্নিবেশ করান। আপনি বর্তমান ব্যবহারকারীর লগইন আইডিতে "CUSTOMER_USER" স্থিতি সেট করেছেন (যদি আপনার এটির প্রয়োজন হয়)। যদি গ্রাহককে মুছে ফেলার প্রয়োজন হয় তবে আপনি এটি চিহ্নিত করতে CUSTOMER_STATUS পতাকা ব্যবহার করেন - আপনি কখনও এই টেবিল থেকে রেকর্ড মুছতে পারবেন না।

এইভাবে, আপনি সর্বদা খুঁজে পেতে পারেন যে কোনও নির্দিষ্ট তারিখের জন্য গ্রাহক টেবিলের অবস্থা কী ছিল - ঠিকানাটি কী ছিল? তারা কি নাম বদলেছে? অনুরূপ বৈধ_ফর্ম এবং বৈধ_মুনিল তারিখগুলি সহ অন্যান্য টেবিলগুলিতে যোগদান করে আপনি পুরো চিত্রটিকে historতিহাসিকভাবে পুনর্গঠন করতে পারেন। বর্তমান অবস্থাটি সন্ধান করতে, আপনি নাল VALID_UNTIL তারিখ সহ রেকর্ড অনুসন্ধান করুন for

এটি অযৌক্তিক (কঠোরভাবে বলতে গেলে, আপনার বৈধ_ফর্মের প্রয়োজন নেই, তবে এটি অনুসন্ধানগুলি আরও সহজ করে তোলে)। এটি আপনার নকশা এবং আপনার ডাটাবেস অ্যাক্সেসকে জটিল করে তোলে। তবে এটি বিশ্বের পুনর্গঠনকে অনেক সহজ করে তুলেছে।


তবে এটি যে ক্ষেত্রগুলি আপডেট হয় না তার জন্য নকল ডেটা যুক্ত করবে? কীভাবে এটি পরিচালনা করবেন?
itzmukeshy7

প্রতিবেদনের ক্ষেত্রে দ্বিতীয় পদ্ধতির সমস্যা দেখা দেয় যদি কোনও গ্রাহকের রেকর্ড এমন সময়ের সাথে সম্পাদনা করা হয় যে নির্দিষ্ট প্রবেশিকা একই গ্রাহকের বা অন্য পৃথক কিনা তা সনাক্ত করা মুশকিল।
অক্ষয় জোশী

আমি এখনও এই সমস্যার
মুখোমুখি

ওহ এবং মন্তব্যের জবাবে, কীভাবে পরিবর্তন হয়নি এমন সমস্ত কিছুর জন্য কেবল নাল সংরক্ষণ করবেন? সুতরাং সর্বশেষতম সংস্করণটি সর্বশেষতম ডেটাগুলির মধ্যে থাকবে, তবে যদি নামটি "বব" হিসাবে 5 দিন আগে ব্যবহৃত হত, তবে কেবল একটি সারিতে, নাম = বব এবং 5 দিন আগে অবধি বৈধ থাকবে।
মূল্য 7

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

186

এটি করার সহজ সরল উপায়:

প্রথমে, আপনি ট্র্যাক করতে চান এমন প্রতিটি ডেটা টেবিলের জন্য একটি ইতিহাস সারণী তৈরি করুন (উদাহরণস্বরূপ কোয়েরি নীচে)। এই টেবিলটিতে প্রতিটি সারণিতে তথ্য সারণীতে প্রতিটি সারণি সম্পাদনা, আপডেট এবং মুছে ফেলা ক্যারিয়ারের জন্য একটি এন্ট্রি থাকবে।

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

এই সিকোয়েন্সিং আচরণটি করতে প্রাথমিক কী কলাম এবং রিভিশন কলামে একটি দুটি কলাম (সংমিশ্রিত) সূচক তৈরি করা হয়। মনে রাখবেন যে ইতিহাসের টেবিল দ্বারা ব্যবহৃত ইঞ্জিনটি মাইএসএএম হলে আপনি কেবল এই ফ্যাশনেই সিকোয়েন্সিং করতে পারবেন ( এই পৃষ্ঠায় 'মাইআইএসএএম নোটস' দেখুন)

ইতিহাসের সারণীটি তৈরি করা মোটামুটি সহজ। নীচের ALTER TABLE ক্যোয়ারিতে (এবং তার নীচে ট্রিগার ক্যোয়ারিতে), আপনার ডেটা সারণিতে সেই কলামটির আসল নামটি দিয়ে 'প্রাথমিক_কি_ক্লোনম' প্রতিস্থাপন করুন।

CREATE TABLE MyDB.data_history LIKE MyDB.data;

ALTER TABLE MyDB.data_history MODIFY COLUMN primary_key_column int(11) NOT NULL, 
   DROP PRIMARY KEY, ENGINE = MyISAM, ADD action VARCHAR(8) DEFAULT 'insert' FIRST, 
   ADD revision INT(6) NOT NULL AUTO_INCREMENT AFTER action,
   ADD dt_datetime DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER revision,
   ADD PRIMARY KEY (primary_key_column, revision);

এবং তারপরে আপনি ট্রিগারগুলি তৈরি করুন:

DROP TRIGGER IF EXISTS MyDB.data__ai;
DROP TRIGGER IF EXISTS MyDB.data__au;
DROP TRIGGER IF EXISTS MyDB.data__bd;

CREATE TRIGGER MyDB.data__ai AFTER INSERT ON MyDB.data FOR EACH ROW
    INSERT INTO MyDB.data_history SELECT 'insert', NULL, NOW(), d.* 
    FROM MyDB.data AS d WHERE d.primary_key_column = NEW.primary_key_column;

CREATE TRIGGER MyDB.data__au AFTER UPDATE ON MyDB.data FOR EACH ROW
    INSERT INTO MyDB.data_history SELECT 'update', NULL, NOW(), d.*
    FROM MyDB.data AS d WHERE d.primary_key_column = NEW.primary_key_column;

CREATE TRIGGER MyDB.data__bd BEFORE DELETE ON MyDB.data FOR EACH ROW
    INSERT INTO MyDB.data_history SELECT 'delete', NULL, NOW(), d.* 
    FROM MyDB.data AS d WHERE d.primary_key_column = OLD.primary_key_column;

এবং তুমি করে ফেলেছ. এখন, 'মাইডিবি.ডাটা' -র সমস্ত সন্নিবেশ, আপডেট এবং মুছে ফেলাগুলি 'মাইডিবি.ডাটা_ইস্টিরি'তে রেকর্ড করা হবে, আপনাকে এর মতো একটি ইতিহাস সারণী প্রদান করে (বিয়োগযুক্ত' ডেটা_কলামগুলি 'কলাম)

ID    revision   action    data columns..
1     1         'insert'   ....          initial entry for row where ID = 1
1     2         'update'   ....          changes made to row where ID = 1
2     1         'insert'   ....          initial entry, ID = 2
3     1         'insert'   ....          initial entry, ID = 3 
1     3         'update'   ....          more changes made to row where ID = 1
3     2         'update'   ....          changes made to row where ID = 3
2     2         'delete'   ....          deletion of row where ID = 2 

আপডেট থেকে আপডেট পর্যন্ত প্রদত্ত কলাম বা কলামগুলির পরিবর্তনগুলি প্রদর্শনের জন্য, আপনাকে প্রাথমিক কী এবং সিকোয়েন্স কলামগুলিতে নিজেই ইতিহাসের টেবিলে যোগদান করতে হবে। আপনি এই উদ্দেশ্যে একটি দর্শন তৈরি করতে পারেন, উদাহরণস্বরূপ:

CREATE VIEW data_history_changes AS 
   SELECT t2.dt_datetime, t2.action, t1.primary_key_column as 'row id', 
   IF(t1.a_column = t2.a_column, t1.a_column, CONCAT(t1.a_column, " to ", t2.a_column)) as a_column
   FROM MyDB.data_history as t1 INNER join MyDB.data_history as t2 on t1.primary_key_column = t2.primary_key_column 
   WHERE (t1.revision = 1 AND t2.revision = 1) OR t2.revision = t1.revision+1
   ORDER BY t1.primary_key_column ASC, t2.revision ASC

সম্পাদনা: ওহ বাহ, 6 বছর আগের লোকেরা আমার ইতিহাসের টেবিল জিনিস পছন্দ করে: পি

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

কোনও নির্দিষ্ট ক্রমে কিছু মন্তব্যকে সম্বোধন করতে:

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

  • যদি প্রাথমিক কী এবং পুনর্বিবেচনা কলামের মধ্যে সম্পর্কটি বন্ধ মনে হয় তবে এর অর্থ সাধারণত যৌথ কীটি কোনওভাবে উদাস হয়। কয়েকটি বিরল অনুষ্ঠানে আমার এটি ঘটেছিল এবং কারণটির জন্য লোকসান হয়েছিল।

  • ট্রিগারগুলি যেমন করে তেমন ব্যবহার করে আমি এই সমাধানটি বেশ পারফরম্যান্স হিসাবে খুঁজে পেয়েছি। এছাড়াও, মাইআইএসএএম দ্রুত সন্নিবেশগুলিতে রয়েছে, যা সমস্ত ট্রিগারই করে। আপনি স্মার্ট ইনডেক্সিং (বা ... এর অভাবে) এর সাথে আরও উন্নতি করতে পারেন। প্রাথমিক কী সহ মাইআইএসএএম টেবিলের মধ্যে একটি একক সারি সন্নিবেশ করানো আপনার কোনও অপারেশন হওয়া উচিত নয়, যদি না আপনার অন্য কোথাও উল্লেখযোগ্য সমস্যা না ঘটে unless পুরো ইতিহাসে আমি মাইএসকিউএল ডাটাবেসটি চালিয়ে যাচ্ছিলাম এই ইতিহাস সারণীর প্রয়োগটি চালু ছিল, এটি কখনই উপস্থিত হওয়া (বহু) পারফরম্যান্স সমস্যার কোনও কারণ ছিল না।

  • আপনি যদি বারবার সন্নিবেশ পেয়ে থাকেন তবে INSERT IGNORE টাইপ প্রশ্নের জন্য আপনার সফ্টওয়্যার স্তরটি পরীক্ষা করুন। হার্মাম, এখনই মনে করতে পারে না, তবে আমি মনে করি এই স্কিম এবং লেনদেনের সাথে এমন কিছু সমস্যা রয়েছে যা শেষ পর্যন্ত একাধিক ডিএমএল ক্রিয়া চালানোর পরে ব্যর্থ হয়। কিছুটা সচেতন হতে হবে, কমপক্ষে।

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


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

1
মূল সারণী থেকে সমস্ত সূচকগুলি কীভাবে ইতিহাসের টেবিলটিতে অনুলিপি করা হয়েছে (কীভাবে টেবিল তৈরি করুন ... লাইক করুন .... কাজ করে) এর কারণে আমি সম্প্রতি একটি প্রকল্পের জন্য এই সমাধানটি ব্যবহার করে একটি সমস্যার মধ্যে পড়েছিলাম। ইতিহাসের টেবিলটিতে অনন্য সূচীগুলি আফ্রিকার আপডেটের পরে ইনসার্ট ক্যোয়ারী বার্ফের কারণ হতে পারে, সুতরাং সেগুলি সরানো দরকার need আমার এই পিএইচপি স্ক্রিপ্টে এই জিনিসটি রয়েছে, আমি নতুন তৈরি ইতিহাসের টেবিলগুলিতে কোনও অনন্য সূচীগুলির জন্য জিজ্ঞাসা করি ("আইডিএক্স থেকে ডেটা_ট্যাবলের WHEE কী_নাম! = 'প্রাথমিক' এবং নন_উনিক = 0" সহ) মুছে ফেলুন এবং সেগুলি মুছে ফেলুন।
ক্ষণস্থায়ী বন্ধ

3
এখানে আমরা প্রতিবার ব্যাকআপ সারণীতে বারবার তথ্য areোকানো হচ্ছে। আমাদের যদি কোনও টেবিলে 10 টি ক্ষেত্র থাকে এবং আমরা 2 টি আপডেট করেছি তবে আমরা বাকি 8 ক্ষেত্রগুলির জন্য বারবার ডেটা যুক্ত করছি। এ থেকে কীভাবে কাটিয়ে উঠব?
itzmukeshy7

6
আপনি তৈরির টেবিলের বিবৃতিটি পরিবর্তন করে ভুলক্রমে বিভিন্ন সূচকের উপর দিয়ে যাওয়া এড়াতে পারবেনCREATE TABLE MyDB.data_history as select * from MyDB.data limit 0;
এরিক

4
@ ট্রান্সিয়েন্টক্লোজারটি কীভাবে আপনি অন্যান্য ক্ষেত্রগুলি ইতিহাসে আসার প্রস্তাব করবেন যা মূল ক্যোয়ারির অংশ ছিল না? উদাহরণস্বরূপ আমি কে এই পরিবর্তনগুলি করে তা ট্র্যাক করতে চাই। sertোকানোর জন্য এটি ইতিমধ্যে একটি ownerক্ষেত্র রয়েছে, এবং আপডেটের জন্য আমি একটি updatedbyক্ষেত্র যুক্ত করতে পারি , তবে মোছার জন্য আমি নিশ্চিত না যে আমি কীভাবে ট্রিগারগুলির মাধ্যমে এটি করতে পারব। data_historyব্যবহারকারী
ঘোড়া

16

এটি সমাধানের জন্য আপনি ট্রিগার তৈরি করতে পারেন। এটি করার জন্য একটি টিউটোরিয়াল এখানে রয়েছে (সংরক্ষণাগারযুক্ত লিঙ্ক)।

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

দীর্ঘদিন ধরে আমি স্ক্রিপ্ট ব্যবহার করে অন্য টেবিলে তথ্য অনুলিপি করছিলাম যেহেতু মাইএসকিউএল তখন ট্রিগারগুলি সমর্থন করে না। আমি এখন এই ট্রিগারটি সমস্ত কিছুর উপর নজর রাখার ক্ষেত্রে আরও কার্যকর বলে মনে করেছি।

এই ট্রিগারটি কোনও পুরানো মানটিকে একটি ইতিহাসের টেবিলে অনুলিপি করবে যদি কেউ কোনও সারি সম্পাদনা করে তবে এটি পরিবর্তন করা হয়। Editor IDএবং last modপ্রতিবার কেউ যখন এই সারিটি সম্পাদনা করে ততবার মূল সারণীতে সংরক্ষণ করা হয়; সময়টি তার বর্তমান ফর্মটিতে পরিবর্তিত হওয়ার সাথে সম্পর্কিত।

DROP TRIGGER IF EXISTS history_trigger $$

CREATE TRIGGER history_trigger
BEFORE UPDATE ON clients
    FOR EACH ROW
    BEGIN
        IF OLD.first_name != NEW.first_name
        THEN
                INSERT INTO history_clients
                    (
                        client_id    ,
                        col          ,
                        value        ,
                        user_id      ,
                        edit_time
                    )
                    VALUES
                    (
                        NEW.client_id,
                        'first_name',
                        NEW.first_name,
                        NEW.editor_id,
                        NEW.last_mod
                    );
        END IF;

        IF OLD.last_name != NEW.last_name
        THEN
                INSERT INTO history_clients
                    (
                        client_id    ,
                        col          ,
                        value        ,
                        user_id      ,
                        edit_time
                    )
                    VALUES
                    (
                        NEW.client_id,
                        'last_name',
                        NEW.last_name,
                        NEW.editor_id,
                        NEW.last_mod
                    );
        END IF;

    END;
$$

আর একটি সমাধান হ'ল একটি পুনর্বিবেচনা ক্ষেত্র রাখা এবং সংরক্ষণের ক্ষেত্রে এই ক্ষেত্রটি আপডেট করা। আপনি সিদ্ধান্ত নিতে পারেন যে সর্বাধিকতমটি সর্বশেষতম সংস্করণ, বা 0 সর্বশেষতম সারি। এটা তোমার উপর.


8

এটি আমরা কীভাবে সমাধান করেছি তা এখানে

একটি ব্যবহারকারীর টেবিলটি এরকম দেখাচ্ছে

Users
-------------------------------------------------
id | name | address | phone | email | created_on | updated_on

এবং ব্যবসায়ের প্রয়োজনীয়তা পরিবর্তিত হয়েছে এবং আমাদের কোনও পূর্ববর্তী ঠিকানা এবং ফোন নম্বর নম্বর ব্যবহারকারীর কাছে থাকা দরকার ছিল। নতুন স্কিমা এর মত দেখাচ্ছে

Users (the data that won't change over time)
-------------
id | name

UserData (the data that can change over time and needs to be tracked)
-------------------------------------------------
id | id_user | revision | city | address | phone | email | created_on
 1 |   1     |    0     | NY   | lake st | 9809  | @long | 2015-10-24 10:24:20
 2 |   1     |    2     | Tokyo| lake st | 9809  | @long | 2015-10-24 10:24:20
 3 |   1     |    3     | Sdny | lake st | 9809  | @long | 2015-10-24 10:24:20
 4 |   2     |    0     | Ankr | lake st | 9809  | @long | 2015-10-24 10:24:20
 5 |   2     |    1     | Lond | lake st | 9809  | @long | 2015-10-24 10:24:20

যে কোনও ব্যবহারকারীর বর্তমান ঠিকানা সন্ধান করার জন্য, আমরা রিভিশন ডিইএসসি এবং লিমিটেড 1 দিয়ে ব্যবহারকারী ডেটা অনুসন্ধান করি

কোনও নির্দিষ্ট সময়ের মধ্যে কোনও ব্যবহারকারীর ঠিকানা পেতে আমরা তৈরি_উইনউইটিন (তারিখ 1, তারিখ 2) ব্যবহার করতে পারি


এটি আমার কাছে থাকা একটি সমাধান যা আমি চাই কিন্তু আমি জানতে চাই আপনি কীভাবে ট্রিগার ব্যবহার করে এই টেবিলে id_user প্রবেশ করতে পারেন?
আধ্যাত্মিক

1
কি ঘটেছে revision=1এর id_user=1? প্রথমে আমি ভেবেছিলাম আপনার গণনা ছিল 0,2,3,...তবে আমি দেখলাম যে id_user=2পুনর্বিবেচনার গণনা হচ্ছে0,1, ...
প্যাথ্রোস

1
আপনার দরকার নেই idএবং id_userকলামগুলি . Just use a group ID of আইডি` (ব্যবহারকারী আইডি) এবং revision
গজুস

6

মারিয়াডিবি 10.3 সাল থেকে সিস্টেম সংস্করণকে সমর্থন করে যা এটি স্ট্যান্ডার্ড এসকিউএল বৈশিষ্ট্য যা আপনি যা চান ঠিক তা করে: এটি সারণী রেকর্ডগুলির ইতিহাস সংরক্ষণ করে এবং SELECTপ্রশ্নের মাধ্যমে এটিতে অ্যাক্সেস সরবরাহ করে । মারিয়াডিবি মাইএসকিউএলের একটি ওপেন-ডেভলপমেন্ট কাঁটাচামচ। আপনি এই লিঙ্কটির মাধ্যমে এর সিস্টেম সংস্করণে আরও জানতে পারেন:

https://mariadb.com/kb/en/library/system-versioned-tables/


দয়া করে উপরের লিঙ্কটি থেকে নীচের বিষয়গুলি নোট করুন: "মাইএসকিল্ডম্প সংস্করণযুক্ত টেবিলগুলি থেকে historicalতিহাসিক সারিগুলি পড়বে না এবং সুতরাং historicalতিহাসিক ডেটা ব্যাকআপ করা হবে না Also এছাড়াও, টাইমস্ট্যাম্পগুলির পুনরুদ্ধার সম্ভব হবে না কারণ সেগুলি সন্নিবেশ / দ্বারা সংজ্ঞায়িত করা যায় না / একজন ব্যাবহারকারি."
ড্যানিয়েল

4

কেন কেবল বিন লগ ফাইল ব্যবহার করবেন না? যদি প্রতিলিপিটি মাইএসকিএল সার্ভারে সেট করা থাকে এবং বিনলগ ফাইল ফর্ম্যাটটি ROW এ সেট করা থাকে, তবে সমস্ত পরিবর্তন ক্যাপচার করা যেতে পারে।

নপ্লে নামে একটি ভাল পাইথন লাইব্রেরি ব্যবহার করা যেতে পারে। আরও তথ্য এখানে


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

3

শুধু আমার 2 সেন্ট। আমি এমন একটি সমাধান তৈরি করব যা রেকর্ড করে ঠিক কী পরিবর্তিত হয় যা ক্ষণস্থায়ী সমাধানের সাথে মিলে যায়।

আমার পরিবর্তনগুলি টেবিলটি সহজ হবে:

DateTime | WhoChanged | TableName | Action | ID |FieldName | OldValue

1) যখন একটি সম্পূর্ণ সারিটি মূল টেবিলটিতে পরিবর্তিত হবে, প্রচুর এন্ট্রি এই টেবিলের মধ্যে চলে যাবে, তবে এটি খুব কমই সম্ভব নয়, তবে এটি কোনও বড় সমস্যা নয় (লোকেরা সাধারণত কেবল একটি জিনিসই পরিবর্তন করে থাকে) 2) ওল্ডওউ (এবং নিউভ্যালু যদি আপনি থাকেন তবে) চাই) কোনও ধরণের মহাকাব্য "যে কোনও ধরণের" হতে হবে যেহেতু এটি কোনও ডেটা হতে পারে, RAW প্রকারের সাহায্যে এটি করার উপায় বা জেএসএন স্ট্রিংগুলি ব্যবহার করে রূপান্তর করতে এবং আউট আউট করতে পারে।

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

তৈরি এবং মুছে ফেলার জন্য, কেবল সারি আইডি, কোনও ক্ষেত্রের প্রয়োজন নেই। মুখ্য টেবিলে একটি পতাকা মুছতে (সক্রিয়?) ভাল হবে।


0

এটি করার সরাসরি উপায় হ'ল টেবিলগুলিতে ট্রিগার তৈরি করা। কিছু শর্ত বা ম্যাপিং পদ্ধতি সেট করুন। আপডেট বা মুছুন যখন ঘটে তখন তা স্বয়ংক্রিয়ভাবে 'পরিবর্তন' টেবিলের মধ্যে প্রবেশ করবে।

তবে সবচেয়ে বড় অংশটি হ'ল যদি আমাদের প্রচুর কলাম এবং প্রচুর টেবিল পাওয়া যায়। আমাদের প্রতিটি টেবিলের প্রতিটি কলামের নাম টাইপ করতে হবে। স্পষ্টতই, এটি সময় নষ্ট।

এটিকে আরও চমকপ্রদভাবে পরিচালনা করতে, আমরা কলামগুলির নাম পুনরুদ্ধার করতে কিছু পদ্ধতি বা ফাংশন তৈরি করতে পারি।

আমরা এটি করতে কেবল তৃতীয়-অংশের সরঞ্জামও ব্যবহার করতে পারি। এখানে আমি একটি জাভা প্রোগ্রাম মাইএসকিএল ট্র্যাকার লিখি


আমি কীভাবে আপনার মাইএসকিএল ট্র্যাকারটি ব্যবহার করতে পারি?
ওয়েবচুন

1
1. প্রতিটি সারণীতে প্রাথমিক কী হিসাবে আপনার আইডি কলাম রয়েছে তা নিশ্চিত করুন। ২. জাভা ফাইলটি স্থানীয় (বা আইডিই) অনুলিপি করুন ৩. আপনার ডাটাবেস কনফিগারেশন এবং কাঠামো অনুসারে 9-15 লাইন থেকে স্ট্যাটিক ভেরিয়েবলগুলি আমদানি করুন এবং সম্পাদনা করুন। ৪. জাভা ফাইলটি পার্স করুন এবং রান করুন ৫. কনসোল লগটি অনুলিপি করুন এবং
মাইএসকিএল

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