যৌগিক প্রাথমিক কীগুলি একটি খারাপ অনুশীলন? [বন্ধ]


14

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

আমার প্রশ্ন এই নিবন্ধ উপর ভিত্তি করে

ডাটাবেস ভুল ডিজাইন

সম্মিলিত প্রাথমিক কী সম্পর্কে অংশ:

খারাপ অনুশীলন নং 6: সম্মিলিত প্রাথমিক কীগুলি

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

একটি যৌগিক প্রাথমিক কী এর চিত্র

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

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


4
এটি একটি "ভাল" বা "খারাপ" অনুশীলন নয়। প্রতিটি ডিজাইনের সিদ্ধান্ত অবশ্যই একটি উদ্দেশ্য পূরণ করে; আপনার যদি সম্মিলিত পিকে প্রয়োজন হয় তা যদি আপনি (নিজেকে এবং অন্যদের কাছে) ব্যাখ্যা করতে পারেন তবে আপনি ভাল। বিপরীতভাবে, আপনি কেন এটির প্রয়োজন নেই তা যদি আপনি ব্যাখ্যা করতে পারেন তবে আপনিও ভাল। আপনি যে নিবন্ধটি লিঙ্ক করেছেন এটি আমার দৃষ্টিতে খুব দরিদ্র কাজটি ব্যাখ্যা করে।
mustaccio

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

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

1
একজন ইনডিজার [সিরিয়াল | এর চেয়ে জিইউডি কীভাবে ভাল) অটো_সংশোধন | পরিচয় | <যা কিছু_আপনি_আপনি_লাইকি]?
ভোরেস

4
আমি সেই লেখককে ভাড়া দেব না
পাপারাজ্জো

উত্তর:


31

বলতে গেলে "Composite keys as PRIMARY KEY is bad practice"একেবারে বাজে!

যৌগিক PRIMARY KEYগুলি প্রায়শই খুব "ভাল জিনিস" এবং প্রতিদিনের জীবনে ঘটে যাওয়া প্রাকৃতিক পরিস্থিতিতে মডেল করার একমাত্র উপায়!

শিক্ষার্থী এবং কোর্সগুলির ক্লাসিক ডেটাবেসস -১১১ শিক্ষার উদাহরণ এবং অনেক শিক্ষার্থী নেওয়া বহু কোর্সের কথা চিন্তা করুন!

সারণী কোর্স এবং ছাত্র তৈরি করুন:

CREATE TABLE course
(
  course_id SERIAL,
  course_year SMALLINT NOT NULL,
  course_name VARCHAR (100) NOT NULL,
  CONSTRAINT course_pk PRIMARY KEY (course_id)
);


CREATE TABLE student
(
  student_id SERIAL,
  student_name VARCHAR (50),
  CONSTRAINT student_pk PRIMARY KEY (student_id)
);

আমি পোস্টগ্রিজ এসকিউএল ডায়ালাইটে (এবং মাইএসকিউএল ) উদাহরণ দিচ্ছি - কিছুটা টুইট করে কোনও সার্ভারের জন্য কাজ করা উচিত।

এখন, আপনি স্পষ্টতই কোন শিক্ষার্থী কোন কোর্সটি নিচ্ছেন তা ট্র্যাক করে রাখতে চান - সুতরাং আপনার যা বলা হয় joining table(যাকে ডাকা হয় linking, many-to-manyবা m-to-nসারণীও বলা হয় )। তারা associative entitiesআরও প্রযুক্তিগত কলঙ্ক হিসাবে পরিচিত হয় !

1 কোর্সে অনেক শিক্ষার্থী থাকতে পারে
1 জন ছাত্র অনেক কোর্স নিতে পারে

সুতরাং, আপনি একটি যোগদানের টেবিল তৈরি করুন

CREATE TABLE course_student
(
  cs_course_id INTEGER NOT NULL,
  cs_student_id INTEGER NOT NULL,

  -- now for FK constraints - have to ensure that the student
  -- actually exists, ditto for the course.

  CREATE CONSTRAINT cs_course_fk FOREIGN KEY (cs_course_id) REFERENCES course (course_id),
  CREATE CONSTRAINT cs_student_fk FOREIGN KEY (cs_student_id) REFERENCES student (student_id)
);

এখন, এই টেবিলটিকে সংবেদনশীলভাবে দেওয়ার একমাত্র উপায় PRIMARY KEYহ'ল KEYএটি অবশ্যই কোর্স এবং শিক্ষার্থীর সংমিশ্রণ। এইভাবে, আপনি পাবেন না:

  • ছাত্র এবং কোর্সের সংমিশ্রণের একটি সদৃশ

    • একটি কোর্সে কেবল একই শিক্ষার্থী একবার ভর্তি হতে পারে এবং

    • একজন শিক্ষার্থী কেবলমাত্র একবারে একই কোর্সে ভর্তি হতে পারে

  • আপনার KEYপ্রতি শিক্ষার্থী কোর্সে রেডিমেড সার্চও রয়েছে - একে একে একটি কভারিং ইনডেক্স ,

  • শিক্ষার্থী এবং শিক্ষার্থী নেই যে কোনও কোর্স নিচ্ছে না তাদের কোর্সগুলি খুঁজে পাওয়া তুচ্ছ!

    - ডিবি-ফিডাল উদাহরণটিতে পিকে সীমাবদ্ধতা তৈরি করে টেবিল তৈরি করা হয়েছে - এটি যে কোনও উপায়ে করা যেতে পারে। আমি ক্রেট টেবিল বিবৃতিতে সবকিছুই পছন্দ করি।


ALTER TABLE course_student 
ADD CONSTRAINT course_student_pk 
PRIMARY KEY (cs_course_id, cs_student_id);

এখন, আপনি যদি খুঁজে পেয়েছিলেন যে শিক্ষার্থীদের জন্য অবশ্যই অনুসন্ধানগুলি ধীর গতিতে রয়েছে তবে একটি UNIQUE INDEX(sc_student_id, sc_course_id) ব্যবহার করুন।

ALTER TABLE course_student 
ADD CONSTRAINT course_student_sc_uq  
UNIQUE (cs_student_id, cs_course_id);

নেই কোন ইনডেক্স যোগ করার জন্য কবচ - তারা হবে করা INSERTs এবং UPDATEধীর গুলি কিন্তু অতিশয় মহান সুবিধার এ কমছেSELECT গুণ! বিকাশকারীদের তাদের জ্ঞান এবং অভিজ্ঞতা অনুসারে সূচী স্থির করার সিদ্ধান্ত নেওয়ার বিষয়, তবে এটি যৌক্তিক PRIMARY KEYগুলি সর্বদা খারাপ থাকে তা কেবল সাধারণ ভুল।

টেবিলগুলিতে যোগদানের ক্ষেত্রে, তারা সাধারণত একমাত্র PRIMARY KEY এটি বোঝায়! ব্যবসায় বা প্রকৃতি বা কার্যত প্রতিটি ক্ষেত্রে যা আমি ভাবতে পারি তার মধ্যে মডেলিংয়ের একমাত্র উপায়টিও টেবিলে যোগদানের জন্য খুব ঘন ঘন!

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

এটি একটি সামান্য উদাহরণ যেখানে একটি যৌগিক PRIMARY KEYখুব ভাল ধারণা হতে পারে, এবং বাস্তবতার মডেল করার একমাত্র বুদ্ধিমান উপায়! আমার মাথার উপরের অংশটি ছেড়ে, আমি আরও অনেক কিছুই ভাবতে পারি ।

আমার নিজের কাজ থেকে একটি উদাহরণ!

একটি ফ্লাইট_আইডযুক্ত একটি ফ্লাইট টেবিল, প্রস্থান এবং আগমন বিমানবন্দরগুলির তালিকা এবং প্রাসঙ্গিক সময়গুলি বিবেচনা করুন এবং তারপরে ক্রু সদস্যদের সাথে একটি কেবিন_ক্রু টেবিলও বিবেচনা করুন!

শুধুমাত্র বিবেকী এই অনুকরণে করা যেতে পারে flight_id এবং attibutes যেমন crew_id এবং শুধুমাত্র বিবেকী সঙ্গে একটি flight_crew টেবিল থাকতে হয় PRIMARY KEYদুই ক্ষেত্র যৌগিক কী ব্যবহার হয়!


2
কোর্স এবং শিক্ষার্থীদের উদাহরণে কোর্স_স্টুডেন্টের পক্ষে idপ্রাথমিক কী এবং একটি অনন্য সূচক cs_student_id cs_course_idথাকতে পারে এবং একই ফলাফল থাকতে পারে?
হ্যাকভান

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

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

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

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

3

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

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

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

যদি আপনার ডিজাইনে ডেটা সারণী আমদানির সাথে জড়িত থাকে যা সম্পর্কিত ডেটা সনাক্ত করতে কোনও অসুবিধাজনক প্রাথমিক কী অন্তর্ভুক্ত করে, তবে আপনি এটির সাথে বেশ আটকে আছেন।

https://www.techopedia.com/definition/5547/primary-key গ্রাহকের সামাজিক সুরক্ষা নম্বরের সাথে সমস্ত ডেটা সারণীতে গ্রাহক কী হিসাবে ডেটা সঞ্চয় করতে হবে বা আপনি যখন স্বেচ্ছাসেবী গ্রাহক_আইডি তৈরি করবেন তা বেছে নেওয়ার উদাহরণ বর্ণনা করে তাদের নিবন্ধন করুন। প্রকৃতপক্ষে, এটি এসএসএন এর কাজ করে বা না করে এটিকে একটি গুরুতর অপব্যবহার; এটি একটি ব্যক্তিগত এবং গোপনীয় ডেটা মান।

সুতরাং, কী হিসাবে বাস্তব-বিশ্বের সত্যকে ব্যবহার করার একটি সুবিধা হ'ল "গ্রাহক" টেবিলটিতে ফিরে না এসে আপনি এগুলি সম্পর্কে অন্যান্য টেবিলগুলিতে তথ্য সংগ্রহ করতে পারেন - তবে এটি একটি ডেটা সুরক্ষার সমস্যাও issue

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


1
আমি বিশেষত পর্যবেক্ষণটির প্রশংসা করি যে কী হিসাবে গ্রাহক ডেটা নির্ভর করে, এমনকি পরিচিত অনন্য গ্রাহক ডেটা (এখানে, এসএসএন), যদি তথ্যটি কখনও সংশোধন করা দরকার হয় তবে ভেঙে যায়।
নির্মাতা স্টিভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.