5.1 ভূমিকা

রিলেশনাল ডাটাবেসে কীগুলি কীভাবে বাছাই করা এবং ব্যবহার করা উচিত সে সম্পর্কে ইন্টারনেট গোঁড়ামিপূর্ণ নিয়মে পূর্ণ। কখনও কখনও বিবাদ এমনকি হলিভারে পরিণত হয়: প্রাকৃতিক বা কৃত্রিম কী ব্যবহার করা উচিত? স্বয়ংক্রিয়-বৃদ্ধি পূর্ণসংখ্যা বা UUID?

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

চলুন সমস্যাটি আলাদা করা যাক এবং শেষে এটিকে আবার একসাথে রাখি। প্রথমত, আসুন প্রশ্ন জিজ্ঞাসা করি - একটি "কী" কি?

আসুন একটি মুহুর্তের জন্য প্রাথমিক কীগুলি ভুলে যাই, আমরা আরও সাধারণ ধারণায় আগ্রহী। একটি কী হল একটি কলাম (কলাম) বা কলাম যার সারিতে ডুপ্লিকেট মান নেই । এছাড়াও, কলামগুলি অবশ্যই অপরিবর্তনীয়ভাবে অনন্য হতে হবে, অর্থাৎ কলামগুলির কোনও উপসেটের এই স্বতন্ত্রতা নেই৷

কিন্তু প্রথমে, কিছু তত্ত্ব:

প্রাথমিক কী

প্রাথমিক কীসরাসরি একটি টেবিলে সারি সনাক্ত করতে ব্যবহৃত হয়। এটি নিম্নলিখিত বিধিনিষেধ মেনে চলতে হবে:

  • প্রাথমিক কীটি সর্বদা অনন্য হতে হবে।
  • এটি সর্বদা টেবিলে উপস্থিত থাকতে হবে এবং একটি মান থাকতে হবে।
  • এটি ঘন ঘন তার মান পরিবর্তন করা উচিত নয়. আদর্শভাবে, এটির মান পরিবর্তন করা উচিত নয়

সাধারণত, একটি প্রাথমিক কী একটি টেবিলের একটি একক কলামকে উপস্থাপন করে, তবে এটি একাধিক কলাম সমন্বিত একটি যৌগিক কীও হতে পারে।

কম্পোজিট কী

কাস্টম কী- বৈশিষ্ট্যগুলির সংমিশ্রণ (কলাম) যা প্রতিটি টেবিল সারিকে অনন্যভাবে সনাক্ত করে। এটা সব কলাম, এবং একাধিক, এবং এক হতে পারে. এই ক্ষেত্রে, এই বৈশিষ্ট্যগুলির মান ধারণ করে এমন লাইনগুলি পুনরাবৃত্তি করা উচিত নয়।

সম্ভাব্য কী

প্রার্থী কী- সম্পর্কের (টেবিল) ন্যূনতম যৌগিক কী প্রতিনিধিত্ব করে, অর্থাৎ, বৈশিষ্ট্যগুলির একটি সেট যা বেশ কয়েকটি শর্ত পূরণ করে:

  • অপ্রতিরোধ্যতা : এটি হ্রাস করা যাবে না, এতে ন্যূনতম সম্ভাব্য বৈশিষ্ট্যের সেট রয়েছে।
  • অনন্যতা : সারি পরিবর্তন নির্বিশেষে এটির অনন্য মান থাকতে হবে।
  • একটি মানের উপস্থিতি : এটির একটি শূন্য মান থাকতে হবে না, অর্থাৎ এটির একটি মান থাকতে হবে।

5.2 প্রাথমিক কীগুলির অদ্ভুত কেস

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

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

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

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

বেশিরভাগ ডাটাবেসে, প্রাথমিক কীগুলি অতীতের জিনিস, এবং প্রতিফলন বা শারীরিক অবস্থানের চেয়ে সামান্য বেশি প্রদান করে। উদাহরণস্বরূপ, একটি PostgreSQL টেবিলে, একটি প্রাথমিক কী ঘোষণা করা স্বয়ংক্রিয়ভাবে একটি সীমাবদ্ধতা বলবৎ করে NOT NULLএবং একটি ডিফল্ট বিদেশী কী সংজ্ঞায়িত করে। উপরন্তু, প্রাথমিক কীগুলি অপারেটরের জন্য পছন্দের কলাম JOIN

প্রাথমিক কী অন্য কী ঘোষণা করার সম্ভাবনাকে ওভাররাইড করে না। একই সময়ে, যদি প্রাথমিক হিসাবে কোনও কী বরাদ্দ না করা হয়, তবে টেবিলটি এখনও সূক্ষ্ম কাজ করবে। বজ্রপাত, যে কোনও ক্ষেত্রে, আপনাকে আঘাত করবে না।

5.3 প্রাকৃতিক কী খোঁজা

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

সম্ভাব্য প্রাকৃতিক কীগুলির জন্য একটি টেবিল পরীক্ষা করার সময় প্রথম জিনিসটি মনে রাখবেন খুব স্মার্ট না হওয়ার চেষ্টা করা। StackExchange-এ ব্যবহারকারী sqlvogel নিম্নলিখিত পরামর্শ দেয়:

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

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

উদাহরণস্বরূপ, শখ ক্লাব সদস্যদের একটি ডাটাবেস দুটি কলামে স্বতন্ত্রতা থাকতে পারে - first_name, last_name. অল্প পরিমাণ ডেটার সাথে, সদৃশগুলি অসম্ভাব্য, এবং একটি বাস্তব দ্বন্দ্ব দেখা দেওয়ার আগে, এই জাতীয় কী ব্যবহার করা বেশ যুক্তিসঙ্গত।

ডাটাবেস বাড়ার সাথে সাথে তথ্যের পরিমাণ বাড়ে, প্রাকৃতিক কী নির্বাচন করা আরও কঠিন হয়ে উঠতে পারে। আমরা যে ডেটা সঞ্চয় করি তা হল বাহ্যিক বাস্তবতার সরলীকরণ, এবং এতে এমন কিছু দিক নেই যা বিশ্বের বস্তুকে আলাদা করে, যেমন তাদের স্থানাঙ্ক যা সময়ের সাথে পরিবর্তিত হয়। যদি কোনো বস্তুর কোনো কোডের অভাব থাকে, তাহলে আপনি কীভাবে দুটি পানীয়ের ক্যান বা দুটি বাক্স ওটমিলের স্থানিক বিন্যাস বা ওজন বা প্যাকেজিংয়ের সামান্য পার্থক্য বাদে বলবেন?

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

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

মুদ্রা, ভাষা, আর্থিক উপকরণ, রাসায়নিক এবং চিকিৎসা নির্ণয় সহ বিভিন্ন বিষয়ের জন্য অনেক শিল্প, পাবলিক এবং আন্তর্জাতিক মান রয়েছে। এখানে এমন কিছু মান রয়েছে যা প্রায়শই প্রাকৃতিক কী হিসাবে ব্যবহৃত হয়:

  • ISO 3166 দেশের কোড
  • ISO 639 ভাষার কোড
  • ISO 4217 অনুযায়ী মুদ্রা কোড
  • স্টক প্রতীক ISIN
  • UPC/EAN, VIN, GTIN, ISBN
  • লগইন নাম
  • ইমেইল ঠিকানা
  • রুম নম্বর
  • নেটওয়ার্ক ম্যাক ঠিকানা
  • পৃথিবীর পৃষ্ঠের বিন্দুগুলির জন্য অক্ষাংশ, দ্রাঘিমাংশ

আমি যখনই সম্ভব এবং যুক্তিসঙ্গত কী ঘোষণা করার পরামর্শ দিই, এমনকি প্রতি টেবিলে একাধিক কী। কিন্তু মনে রাখবেন যে উপরের সবগুলির ব্যতিক্রম থাকতে পারে।

  • প্রত্যেকেরই একটি ইমেল ঠিকানা নেই, যদিও এটি কিছু ডাটাবেস অবস্থার অধীনে গ্রহণযোগ্য হতে পারে। এছাড়াও, লোকেরা সময়ে সময়ে তাদের ইমেল ঠিকানা পরিবর্তন করে। (পরে কী স্থিতিশীলতা সম্পর্কে আরও।)
  • ISIN স্টক চিহ্নগুলি সময়ে সময়ে পরিবর্তিত হয়, উদাহরণস্বরূপ, GOOG এবং GOOGL চিহ্নগুলি Google থেকে Alphabet পর্যন্ত কোম্পানির পুনর্গঠনকে সঠিকভাবে বর্ণনা করে না৷ কখনও কখনও বিভ্রান্তি দেখা দিতে পারে, যেমন TWTR এবং TWTRQ এর সাথে, কিছু বিনিয়োগকারী ভুলবশত টুইটার আইপিওর সময় পরবর্তীটি কিনেছিলেন।
  • সামাজিক নিরাপত্তা নম্বরগুলি শুধুমাত্র মার্কিন নাগরিকদের দ্বারা ব্যবহার করা হয়, গোপনীয়তা সীমাবদ্ধতা রয়েছে এবং মৃত্যুর পরে পুনরায় ব্যবহার করা হয়। এ ছাড়া নথি চুরির পর মানুষ নতুন নম্বর পেতে পারে। অবশেষে, একই নম্বর একজন ব্যক্তি এবং একজন আয়কর শনাক্তকারী উভয়কেই সনাক্ত করতে পারে।
  • জিপ কোডগুলি শহরগুলির জন্য একটি দুর্বল পছন্দ৷ কিছু শহরের একটি সাধারণ সূচক আছে, বা বিপরীতভাবে, একটি শহরে বেশ কয়েকটি সূচক রয়েছে।

5.4 কৃত্রিম কী

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

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

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

সারোগেটস

কৃত্রিম কীগুলি অ্যাঙ্কর হিসাবে ব্যবহার করা হয় - নিয়ম এবং কলামগুলি যেভাবেই পরিবর্তিত হোক না কেন, একটি সারি সর্বদা একইভাবে চিহ্নিত করা যেতে পারে। এই উদ্দেশ্যে ব্যবহৃত কৃত্রিম চাবিটিকে "সারোগেট কী" বলা হয় এবং বিশেষ মনোযোগ প্রয়োজন। আমরা নিচে surrogates বিবেচনা করবে.

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

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

উদাহরণ:

  • ইউএস লাইসেন্স প্লেটের জন্য, অস্পষ্ট অক্ষরগুলির ব্যবহার সম্পর্কে নিয়ম রয়েছে, যেমন O এবং 0৷
  • ডাক্তারদের হাতের লেখার কারণে হাসপাতাল এবং ফার্মেসিগুলোকে বিশেষভাবে সতর্ক থাকতে হবে।
  • আপনি টেক্সট বার্তা দ্বারা একটি নিশ্চিতকরণ কোড পাঠান? GSM 03.38 অক্ষর সেটের বাইরে যাবেন না।
  • বেস 64 এর বিপরীতে, যা নির্বিচারে বাইট ডেটা এনকোড করে, বেস32 একটি সীমিত অক্ষর সেট ব্যবহার করে যা মানুষের জন্য পুরানো কম্পিউটার সিস্টেমে ব্যবহার এবং পরিচালনা করার জন্য সুবিধাজনক।
  • প্রকুইন্টগুলি পাঠযোগ্য, লেখার যোগ্য এবং উচ্চারণযোগ্য শনাক্তকারী। এগুলি হল দ্ব্যর্থহীনভাবে বোঝা ব্যঞ্জনবর্ণ এবং স্বরবর্ণের PRO-nouncable QUINT-উপলেট।

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

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

যাইহোক, দয়া করে মনে রাখবেন যে আপনি সর্বজনীন সংখ্যাসূচক কীগুলিতে অনুক্রমিক ক্রম ব্যবহার করবেন না, কারণ এটি আপনাকে সংস্থানগুলির (/videos/1.mpeg, /videos/2.mpeg, এবং আরও অনেক কিছু) মাধ্যমে গুঞ্জন করতে দেয় এবং সংখ্যা সম্পর্কে তথ্যও ফাঁস করে। তথ্য সংখ্যার ক্রমানুসারে একটি Feistel নেট সুপার ইম্পোজ করুন এবং সংখ্যার ক্রম লুকিয়ে রেখে স্বতন্ত্রতা রক্ষা করুন।

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

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

5.5 সারোগেট কী

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

আপনি যদি PostgreSQL এর সিস্টেম কলামগুলির সাথে পরিচিত হন, তাহলে আপনি সারোগেটগুলিকে প্রায় একটি ডাটাবেস বাস্তবায়ন পরামিতি (যেমন ctid) হিসাবে ভাবতে পারেন, যা যাইহোক, কখনই পরিবর্তন হয় না। সারোগেট মানটি প্রতি সারিতে একবার নির্বাচিত হয় এবং তারপরে কখনও পরিবর্তন হয় না।

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

অন্যদিকে, সর্বজনীনভাবে ভাগ করা কীগুলির বিদেশী কীগুলিকে ON UPDATE CASCADEসর্বাধিক নমনীয়তা প্রদানের জন্য চিহ্নিত করা উচিত৷ একটি ক্যাসকেডিং আপডেট আশেপাশের লেনদেনের মতো একই বিচ্ছিন্নতা স্তরে চলে, তাই সমসাময়িক সমস্যাগুলি নিয়ে চিন্তা করবেন না - আপনি যদি একটি কঠোর বিচ্ছিন্নতা স্তর বেছে নেন তবে ডাটাবেস ঠিক থাকবে৷

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

বাহ্যিক সিস্টেমগুলিকে বিশেষভাবে ট্রান্সমিশনের জন্য ডিজাইন করা অন্যান্য কৃত্রিম কীগুলি ব্যবহার করতে বাধ্য করা আমাদেরকে সেই কীগুলি পরিবর্তন করার প্রয়োজন মেটাতে, সারোগেটের সাথে অভ্যন্তরীণ রেফারেন্সিয়াল অখণ্ডতা বজায় রাখার অনুমতি দেয়৷

স্বয়ংক্রিয় বৃদ্ধি INT/BIGINT

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

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

সিরিয়াল কীগুলির অসুবিধা:

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

UUID

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

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

তাহলে কেন সবাই PostgreSQL এ তাদের ব্যবহার করছে না? এটির জন্য বেশ কয়েকটি কল্পিত কারণ রয়েছে এবং একটি যৌক্তিক যেটির চারপাশে কাজ করা যেতে পারে, এবং আমি আমার পয়েন্টটি ব্যাখ্যা করার জন্য মানদণ্ড উপস্থাপন করব।

প্রথমত, আমি দূরবর্তী কারণ সম্পর্কে কথা বলব। কিছু লোক মনে করে যে UUIDগুলি স্ট্রিং কারণ সেগুলি একটি ড্যাশ সহ ঐতিহ্যগত হেক্সাডেসিমেল স্বরলিপিতে লেখা হয়: 5bd68e64-ff52-4f54-ace4-3cd9161c8b7f. প্রকৃতপক্ষে, কিছু ডাটাবেসের একটি কমপ্যাক্ট (128-বিট) uuid টাইপ নেই, কিন্তু PostgreSQL আছে এবং এর আকার রয়েছে দুই bigint, অর্থাৎ, ডাটাবেসের অন্যান্য তথ্যের পরিমাণের তুলনায়, ওভারহেডটি নগণ্য।

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

UUID-এর আসল সমস্যা হল যে অত্যন্ত র্যান্ডমাইজড মানগুলি রাইট-এহেড লগে (WAL) পুরো পৃষ্ঠা লেখার কারণে লেখার পরিবর্ধনের দিকে পরিচালিত করে । যাইহোক, কার্যক্ষমতার অবনতি আসলে UUID প্রজন্মের অ্যালগরিদমের উপর নির্ভর করে।

লিখুন পরিবর্ধন পরিমাপ করা যাক . প্রকৃতপক্ষে, সমস্যাটি পুরানো ফাইল সিস্টেমে। যখন PostgreSQL ডিস্কে লেখে, এটি ডিস্কের "পৃষ্ঠা" পরিবর্তন করে। আপনি কম্পিউটারের পাওয়ার বন্ধ করলে, ডিস্কে ডেটা নিরাপদে সংরক্ষণ করার আগে বেশিরভাগ ফাইল সিস্টেম এখনও একটি সফল লেখার রিপোর্ট করবে। যদি PostgreSQL নির্দ্বিধায় এমন একটি ক্রিয়া সম্পন্ন বলে উপলব্ধি করে, তাহলে পরবর্তী সিস্টেম বুট করার সময় ডাটাবেসটি নষ্ট হয়ে যাবে।

যেহেতু PostgreSQL ধারাবাহিকতা প্রদানের জন্য বেশিরভাগ অপারেটিং সিস্টেম/ফাইলসিস্টেম/ডিস্ক কনফিগারেশনকে বিশ্বাস করতে পারে না, তাই ডাটাবেস পরিবর্তিত ডিস্ক পৃষ্ঠার সম্পূর্ণ অবস্থাকে একটি লেখা-আগামী লগে সংরক্ষণ করে যা সম্ভাব্য ক্র্যাশ থেকে পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে। UUID-এর মতো অত্যন্ত র্যান্ডমাইজড মানগুলিকে সূচীকরণে সাধারণত বিভিন্ন ডিস্ক পৃষ্ঠার একটি গুচ্ছ জড়িত থাকে এবং প্রতিটি নতুন এন্ট্রির জন্য WAL-এ পূর্ণ পৃষ্ঠার আকার (সাধারণত 4 বা 8 KB) লেখা হয়। এটি তথাকথিত পূর্ণ-পৃষ্ঠা লিখুন (পূর্ণ-পৃষ্ঠা লিখুন, FPW)।

কিছু UUID প্রজন্মের অ্যালগরিদম (যেমন টুইটারের "স্নোফ্লেক" বা পোস্টগ্রেএসকিউএল-এর uuid-ossp এক্সটেনশনে uuid_generate_v1() প্রতিটি মেশিনে একঘেয়ে বর্ধিত মান তৈরি করে। এই পদ্ধতিটি কম ডিস্ক পৃষ্ঠাগুলিতে লেখাকে একত্রিত করে এবং FPW হ্রাস করে।

5.6 উপসংহার এবং সুপারিশ

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

প্রতিটি টেবিলের জন্য:

  • সমস্ত প্রাকৃতিক কী সংজ্ঞায়িত করুন এবং ঘোষণা করুন।
  • ডিফল্ট মান সহ UUID<table_name>_id টাইপের একটি সারোগেট কী তৈরি করুন । এমনকি আপনি এটিকে একটি প্রাথমিক কী হিসাবে চিহ্নিত করতে পারেন। আপনি যদি এই শনাক্তকারীর সাথে টেবিলের নাম যোগ করেন, তাহলে এটি সরল হবে , যেমন এর পরিবর্তে গ্রহণ করুন । ক্লায়েন্টদের কাছে এই কীটি পাস করবেন না এবং ডাটাবেসের বাইরে এটি প্রকাশ করবেন না।uuid_generate_v1()JOINJOIN foo USING (bar_id)JOIN foo ON (foo.bar_id = bar.id)
  • মধ্যবর্তী সারণীগুলির জন্য যেগুলি মধ্য দিয়ে যায় JOIN, সমস্ত বিদেশী কী কলামকে একটি একক যৌগিক প্রাথমিক কী হিসাবে ঘোষণা করুন।
  • ঐচ্ছিকভাবে, একটি কৃত্রিম কী যোগ করুন যা URL বা অন্যান্য স্ট্রিং রেফারেন্স ইঙ্গিতগুলিতে ব্যবহার করা যেতে পারে। স্বয়ংক্রিয়-বর্ধিত পূর্ণসংখ্যাগুলিকে মাস্ক করতে একটি Feistel গ্রিড বা pg_hashids ব্যবহার করুন ।
  • ON UPDATE RESTRICTবিদেশী কী হিসাবে এবং কৃত্রিম বিদেশী কীগুলির জন্য সারোগেট UUID ব্যবহার করে একটি ক্যাসকেডিং সীমাবদ্ধতা নির্দিষ্ট করুন ON UPDATE CASCADE৷ আপনার নিজস্ব যুক্তির উপর ভিত্তি করে প্রাকৃতিক কীগুলি চয়ন করুন।

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