ডুপ্লিকেটগুলি এড়ানোর সম্ভাব্য উপায়গুলি কী কী যখন আপনি কোনও অনন্য সূচক যুক্ত করতে পারবেন না


10

আমি একযোগে সমস্যার মধ্যে আছি

একটি সাধারণ সমস্যা যেখানে ব্যবহারকারী 2 বা 3 লেনদেন প্রেরণ করে এমন কিছু ডেটা অবিরত রাখে যা ডিবিতে নকল করা উচিত নয়, সদৃশ রেকর্ডের ক্ষেত্রে আপনাকে একটি ত্রুটি ফেরানো উচিত।

এই সমস্যাটি সহজ যখন আপনি একটি কলামে একটি সূচক (অনন্য) যুক্ত করতে পারেন যেখানে আপনি একটি হ্যাশ সঞ্চয় করেন।

তবে এই ক্ষেত্রে আমার কাছে একটি বিশাল টেবিল রয়েছে (সম্ভবত কয়েক মিলিয়ন রেকর্ড) এবং আমি কেবল সারণীটি সংশোধন করতে পারি না।

আসলে, আমাদের একটি কলাম রয়েছে যেখানে আমরা ডেটার একটি হ্যাশ সঞ্চয় করি যা অনুলিপি করা উচিত নয় তবে একটি অনন্য সূচক সেট করা হয়নি।

আমি আমার জাভা কোডটি চেষ্টা করে যাচ্ছি যে ফ্লাশের ঠিক আগে উপস্থিত রয়েছে কিনা, এখনও নকল পেয়ে যাচ্ছি check

এর জন্য আমার সম্ভাব্য সমাধানগুলি হ'ল:

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

আপনার হ্যাশের চেকটি কি হ্যাশের সংঘর্ষের কারণে বা চেকটিতে থাকা বাগের কারণে ব্যর্থ হচ্ছে?
candied_orange

4
আমি আপনার প্রশ্ন পাই না। সুতরাং লক্ষ লক্ষ রেকর্ড সহ আপনার সমস্ত বিশাল টেবিলের জন্য একবার সূচিকাগুলির পরিবর্তে, আপনি যে মিলিয়ন রেকর্ড যুক্ত করবেন তার প্রতিটি মিলিয়নের জন্য পড়তে পছন্দ করেন, বিদ্যমান লক্ষ লক্ষ লোক ডাবল সন্ধান করার জন্য? বা কিছু তথ্য সদৃশ এবং আপনার চেক করতে যোগ দেয়?
ক্রিস্টোফ

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

4
আমি এটি পাই না - কেন একটি ট্রিগার যুক্ত করা বা একটি সূচি "অনুকরণ" করার জন্য অন্য টেবিল যুক্ত করা কেবল বিদ্যমান সারণীতে সূচক যুক্ত করার চেয়ে কম ডাউনটাইম লাগে?
ডক ব্রাউন

2
@ আরাফুরু: কে বলেছিলেন যে আপনাকে একটি অনন্য সূচি তৈরি করতে হবে? একটি স্ট্যান্ডার্ড, অ-অনন্য সূচক সম্ভবত আপনাকে একই ধরণের হ্যাশ মান সহ সমস্ত সারি দ্রুত সন্ধান করতে হবে।
ডক ব্রাউন 21

উত্তর:


3

এমন কয়েকটি সম্ভাব্য পরিস্থিতি রয়েছে যা সমাধান করা সহজ এবং একটি ক্ষতিকারক পরিস্থিতি যা তা নয়।

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

যদি ব্যবহারকারী নকলের সাথে মানগুলির একটি তালিকা জমা দেয় - কোডটির একক অনুরোধে অ্যাপ্লিকেশনটি ডুপ্লিকেট সহ say এবিসি, ডিইএফ, এবিসি} বলুন - অ্যাপ্লিকেশনটি সদৃশগুলি সনাক্ত করতে এবং ফিল্টার করতে পারে, সম্ভবত একটি ত্রুটি ছুঁড়ে ফেলে। Checkোকানোর আগে আপনাকে ডিবিতে কোনও অনন্য মান রয়েছে না তাও পরীক্ষা করতে হবে।

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

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

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

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

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


2

আসলে, আমাদের একটি কলাম রয়েছে যেখানে আমরা ডেটার একটি হ্যাশ সঞ্চয় করি যা অনুলিপি করা উচিত নয় তবে একটি অনন্য সূচক সেট করা হয়নি।

হ্যাশের সংঘর্ষগুলি পরীক্ষা করা একটি ভাল প্রথম পদক্ষেপ, তবে সাবধান, আপনি যদি গ্যারান্টি দিতে পারবেন না যে একই প্রোগ্রামটি আবার চালু করা হয় তবে একই ডেটাতে একই হ্যাশ তৈরি হবে । অনেকগুলি "ফাস্ট" হ্যাশ ফাংশন একটি ইনবিল্ট প্রেং ব্যবহার করে যা প্রোগ্রাম শুরুর সময়ে বদ্ধ হয়। আপনি যদি এই অ্যাপ্লিকেশনটিতে যা করেন তবে হ্যাশকে সর্বদা একই হওয়ার দরকার থাকলে একটি ক্রিপ্টোগ্রাফিক হ্যাশ ব্যবহার করুন। দ্রষ্টব্য আপনার কোনও ভাল বা সুরক্ষিত ক্রিপ্টোগ্রাফিক হ্যাশ দরকার নেই।

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

তাই:

পদক্ষেপ 1: আপনি কোনও ক্রিপ্টোগ্রাফিক হ্যাশের সংঘর্ষ পেয়েছেন কিনা তা পরীক্ষা করে দেখুন

পদক্ষেপ 2: হ্যাশগুলি মিলে গেলে, আসল ডেটা একই হয় তা পরীক্ষা করুন


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

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

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

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

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

2

একটি অনন্য প্রাথমিক কী দিয়ে একটি নতুন টেবিল তৈরি করুন

ক্লায়েন্টের পক্ষ থেকে প্রতিটি রেকর্ডের জন্য জিইউডিগুলি উত্পাদন করা শুরু করুন যাতে আপনি সহজ পুনরায় সনাক্ত করতে পারেন।

নতুন টেবিলটিতে নতুন রেকর্ড রাখুন যাতে অন্তত নতুন ডেটা আসার জন্য আপনি ভাল।

নতুন টেবিলে "চেকড এজেনস্ট ওল্ড ডেটা" তে একটি কলাম রয়েছে

একটি ব্যাকএন্ড টাস্ক রয়েছে যা আপনি বর্তমান স্লো হ্যাশ চেক যা যা করেন তা দেখতে পুরানো ডেটাতে একটি সদৃশ খুঁজে পেতে পারে এবং তদনুসারে পতাকাটি সেট করা যায় কিনা তা দেখার জন্য, এই মুহূর্তে সদৃশকে প্রত্যাখ্যান করুন, ক্লায়েন্টকে একটি বিজ্ঞপ্তি ফেরত পাঠানো হচ্ছে।

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

আপনি এই টাস্কটি কয়েক দিনের জন্য চালিয়ে যেতে পারেন (যদি প্রয়োজন হয়), কোনও ডাউনটাইম ছাড়াই ডেটা স্থানান্তর করে।

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

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


1

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

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