আমি কি একটি একক টেবিলে একাধিক প্রাথমিক কী পেতে পারি?
আমি কি একটি একক টেবিলে একাধিক প্রাথমিক কী পেতে পারি?
উত্তর:
একটি সারণীতে একটি সমন্বিত প্রাথমিক কী থাকতে পারে যা দুটি বা ততোধিক কলাম থেকে তৈরি প্রাথমিক কী। উদাহরণ স্বরূপ:
CREATE TABLE userdata (
userid INT,
userdataid INT,
info char(200),
primary key (userid, userdataid)
);
আপডেট: এখানে সম্মিলিত প্রাথমিক কীগুলির আরও বিশদ বিবরণের একটি লিঙ্ক রয়েছে।
একটি টেবিলে একাধিক প্রার্থী কী থাকতে পারে। প্রতিটি প্রার্থী কী হ'ল একক কলাম বা কলামগুলির সেট যা একচেটিয়াভাবে নেওয়া হয় এবং একসাথে নেওয়া হয় না। সুতরাং, যে কোনও প্রার্থী কী এর সমস্ত কলামের মান উল্লেখ করা যথেষ্ট তা নির্ধারণ করার জন্য যথেষ্ট যে এখানে একটি সারি রয়েছে যা মানদণ্ডগুলি পূরণ করে, বা কোনও সারি নেই।
প্রার্থী কীগুলি আপেক্ষিক ডেটা মডেলের একটি মৌলিক ধারণা।
এটি সাধারণ অনুশীলন, যদি একাধিক কী এক টেবিলে উপস্থিত থাকে, প্রার্থী কীগুলির মধ্যে একটিকে প্রাথমিক কী হিসাবে মনোনীত করতে। টেবিলে কোনও বিদেশী কীগুলি অন্য কোনও প্রার্থী কী-এর পরিবর্তে প্রাথমিক কীটি উল্লেখ করার পক্ষে সাধারণ অনুশীলন।
আমি এই অনুশীলনগুলির পরামর্শ দিচ্ছি, তবে রিলেশনাল মডেলটিতে এমন কোনও কিছুই নেই যার জন্য প্রার্থী কীগুলির মধ্যে একটি প্রাথমিক কী নির্বাচন করা প্রয়োজন।
এটি মূল প্রশ্নের এবং @ কাল্মির প্রশ্নের উভয়েরই উত্তর
একাধিক স্বতঃ-উত্পাদক কলামগুলি কী লাভ করবে?
নীচের এই কোডটিতে একটি সম্মিলিত প্রাথমিক কী রয়েছে। এর কলামগুলির একটি হ'ল স্ব-বর্ধিত। এটি কেবল মাইআইএসএএম-এ কাজ করবে। InnoDB একটি ত্রুটি তৈরি করবে " ERROR 1075 (42000): ভুল সারণী সংজ্ঞা; শুধুমাত্র একটি স্বয়ংক্রিয় কলাম থাকতে পারে এবং এটি অবশ্যই কী হিসাবে সংজ্ঞায়িত করা উচিত "।
DROP TABLE IF EXISTS `test`.`animals`;
CREATE TABLE `test`.`animals` (
`grp` char(30) NOT NULL,
`id` mediumint(9) NOT NULL AUTO_INCREMENT,
`name` char(30) NOT NULL,
PRIMARY KEY (`grp`,`id`)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Which returns:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
(এগুলি অধ্যয়নরত হয়েছে, অনেক)
প্রার্থী কী - একটি সারণী সারি স্বতন্ত্রভাবে সনাক্ত করতে একটি সর্বনিম্ন কলামের সংমিশ্রণ প্রয়োজন।
যৌগিক কী - 2 বা আরও কলাম।
সূত্র:
https://en.wikedia.org/wiki/Superkey
https://en.wikedia.org/wiki/Candidate_key
https://en.wikedia.org/wiki/Primary_key
https://en.wikedia.org / উইকি / Compound_key
অন্যদের দ্বারা উল্লিখিত হিসাবে বহু-কলাম প্রাথমিক কীগুলি থাকা সম্ভব। তবে এটি লক্ষ করা উচিত যে আপনার যদি কিছু কার্যক্ষম নির্ভরতা থাকে যা কোনও কী দ্বারা প্রবর্তিত হয় না, আপনার সম্পর্কটিকে স্বাভাবিক করার কথা বিবেচনা করা উচিত ।
উদাহরণ:
Person(id, name, email, street, zip_code, area)
এর মধ্যে একটি কার্যকরী নির্ভরতা থাকতে পারে id -> name,email, street, zip_code and area
তবে প্রায়শই একটি এর zip_code
সাথে যুক্ত হয় area
এবং এর মধ্যে একটি অভ্যন্তরীণ কার্যকরী নির্ভরতা থাকে zip_code -> area
।
সুতরাং কেউ এটি অন্য টেবিলের মধ্যে বিভক্ত বিবেচনা করতে পারে:
Person(id, name, email, street, zip_code)
Area(zip_code, name)
যাতে এটি তৃতীয় স্বাভাবিক ফর্মের সাথে সামঞ্জস্যপূর্ণ ।
প্রাথমিক কীটি অত্যন্ত দুর্ভাগ্যজনক স্বরলিপি, কারণ লজিকাল মডেলের সাথে পরিণতিতে "প্রাথমিক" এবং অবচেতন সংস্থার অর্থ। আমি এইভাবে এটি ব্যবহার এড়ানো। পরিবর্তে আমি শারীরিক মডেলের সরোগেট কী এবং লজিকাল মডেলের প্রাকৃতিক কী (গুলি) উল্লেখ করি।
এটি গুরুত্বপূর্ণ যে প্রতিটি সত্তার জন্য লজিকাল মডেলটিতে কমপক্ষে "ব্যবসায়িক বৈশিষ্ট্যগুলির একটি সেট থাকা উচিত যা সত্তার জন্য কী সমন্বিত করে। বয়েস, কোডড, তারিখ এবং আল এগুলি সম্পর্কিত মডেলটিতে প্রার্থী কী হিসাবে উল্লেখ করেন। এরপরে আমরা যখন এই সংস্থাগুলির জন্য টেবিলগুলি তৈরি করি তখন তাদের প্রার্থী কীগুলি সেই টেবিলগুলিতে প্রাকৃতিক কী হয়ে যায়। কেবলমাত্র সেই প্রাকৃতিক কীগুলির মাধ্যমেই ব্যবহারকারীরা সারণিতে সারিগুলি স্বতন্ত্রভাবে সনাক্ত করতে সক্ষম হন; সার্গেট কীগুলি সর্বদা ব্যবহারকারীদের কাছ থেকে লুকানো উচিত। এটি কারণ সরোগেট কীগুলির কোনও ব্যবসায়িক অর্থ নেই।
তবে আমাদের টেবিলগুলির জন্য শারীরিক মডেলটি অনেকগুলি ক্ষেত্রে কোনও সারোগেট কী ছাড়াই অকার্যকর হবে। মনে রাখবেন যে অ-ক্লাস্টারযুক্ত সূচির জন্য অন-আচ্ছাদিত কলামগুলি কেবল ক্লাস্টারড ইনডেক্সের কী লুকের মাধ্যমে পাওয়া যাবে (সাধারণভাবে) এক মুহুর্তের জন্য স্তূপ হিসাবে প্রয়োগ করা টেবিলগুলি উপেক্ষা করুন)। যখন আমাদের উপলভ্য প্রাকৃতিক কী (গুলি) প্রশস্ত থাকে (1) আমাদের অ-গুচ্ছযুক্ত পাতাগুলিগুলির প্রস্থ প্রশস্ত করে, স্টোরেজ প্রয়োজনীয়তা বাড়ায় এবং সেই অ-ক্লাস্টারযুক্ত সূচীর সন্ধান এবং স্ক্যানগুলির জন্য অ্যাক্সেসগুলি পড়ুন; এবং (২) আমাদের ক্লাস্টারড ইনডেক্স থেকে সূচকের উচ্চতা এবং সূচকের আকার বাড়িয়ে ফ্যান-আউট হ্রাস করে, আবার আমাদের ক্লাস্টারড ইনডেক্সগুলির জন্য পাঠ্য এবং স্টোরেজ প্রয়োজনীয়তা বৃদ্ধি করে; এবং (3) আমাদের ক্লাস্টারযুক্ত সূচকগুলির জন্য ক্যাশে প্রয়োজনীয়তা বাড়ায়। অন্যান্য সূচী এবং ডেটা ক্যাশে ছাড়িয়ে তাড়া করা।
এইখানেই আরডিবিএমএসকে "প্রাথমিক কী" হিসাবে মনোনীত একটি ছোট সারোগেট কী উপকারী প্রমাণ করে। ক্লাস্টারিং কী হিসাবে সেট করা হলে, ক্লাস্টারযুক্ত নীতি থেকে ক্লাস্টারড ইনডেক্সে এবং সম্পর্কিত টেবিলগুলি থেকে বিদেশী কী লকআপগুলিতে কী লুপআপের জন্য ব্যবহার করা যায়, এই সমস্ত অসুবিধা অদৃশ্য হয়ে যায়। ক্লাস্টারড ইনডেক্সের উচ্চতা এবং আকার হ্রাস করতে, আমাদের ক্লাস্টারড ইনডেক্সগুলির ক্যাশে লোড হ্রাস করতে, কোনও যান্ত্রিকতার মাধ্যমে ডেটা অ্যাক্সেস করার সময় পাঠ্য হ্রাস (ইনডেক্স স্ক্যান, সূচী অনুসন্ধান, নন-ক্লাস্টার কী লকউইচ বা বিদেশী কী লুকআপ) আমাদের ক্লাস্টারড ইনডেক্স ফ্যান-আউটগুলি আবার বাড়বে এবং আমাদের টেবিলগুলির ক্লাস্টারযুক্ত এবং অবিচ্ছিন্ন উভয় সূচকের জন্য স্টোরেজ প্রয়োজনীয়তা হ্রাস করুন।
নোট করুন যে এই সুবিধাগুলি কেবল তখনই ঘটে যখন সার্গেট কীটি ছোট এবং ক্লাস্টারিং কী উভয়ই থাকে। যদি একটি জিইউইডি ক্লাস্টারিং কী হিসাবে ব্যবহৃত হয় তবে পরিস্থিতিটি প্রায়শই নিকৃষ্টতম প্রাকৃতিক কী ব্যবহার করা হয় তার চেয়ে খারাপ হয়ে যায়। যদি টেবিলটি হিপ হিসাবে সংগঠিত হয় তবে 8-বাইট (হিপ) RowID কী অনুসন্ধানের জন্য ব্যবহৃত হবে, যা একটি 16-বাইট জিআইডি থেকে ভাল তবে 4-বাইট পূর্ণসংখ্যার চেয়ে কম পারফরম্যান্ট।
আরও ভাল ক্লাস্টারিং কী অনুসন্ধানের চেয়ে ব্যবসায়ের সীমাবদ্ধতার কারণে যদি কোনও জিআইডি ব্যবহার করা আবশ্যক। উদাহরণস্বরূপ যদি কোনও ছোট সাইট শনাক্তকারী এবং 4-বাইট "সাইট-সিকোয়েন্স-নম্বর" সম্ভব হয় তবে সেই নকশাটি সার্গেট কী হিসাবে জিইউইডির চেয়ে ভাল পারফরম্যান্স দিতে পারে।
যদি একটি গাদা (হ্যাশ সম্ভবত যোগ দেয়) এর পরিণতিগুলি পছন্দসই স্টোরেজ করে তোলে তবে বৃহত্তর ক্লাস্টারিং কীগুলির ব্যয়গুলি বাণিজ্য-বিশ্লেষণের মধ্যে ভারসাম্যপূর্ণ হওয়া দরকার।
এই উদাহরণটি বিবেচনা করুন ::
ALTER TABLE Persons
ADD CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
যেখানে টিউপলটি " (পি_আইডি, লাস্টনাম) " স্বতন্ত্রতার সীমাবদ্ধতার প্রয়োজন এবং লম্বা ইউনিকোড লাস্টনাম প্লাস 4 বাইট পূর্ণসংখ্যার হতে পারে, সেখানে (1) ঘোষিতভাবে এই সীমাবদ্ধতাটি " ADC CONSTRAINT pk_PersonID UNIQUE NONCUSTERED " হিসাবে প্রয়োগ করা বাঞ্চনীয় হবে would , লাস্টনাম) "এবং (2) পৃথকভাবে একটি ছোট সারোগেট কীটিকে ক্লাস্টারড ইনডেক্সের " প্রাথমিক কী "হিসাবে ঘোষণা করে। এটি লক্ষণীয় যে অনিতা সম্ভবত একটি আবরণ ক্ষেত্র তৈরি করার জন্য কেবল এই সীমাবদ্ধতার সাথে লাস্টনাম যুক্ত করতে ইচ্ছুক, যা একটি ক্লাস্টার ইনডেক্সে অপ্রয়োজনীয় কারণ সমস্ত ক্ষেত্রগুলি এর দ্বারা আচ্ছাদিত।
শারীরিক দিক থেকে "স্টোরেজ ইন লুকিং কী" শব্দের সাথে "পছন্দের প্রাকৃতিক বা প্রার্থী কী" (লজিকাল মডেল থেকে) অর্থ সংঘাতের কারণে এসকিউএল সার্ভারের একটি প্রাথমিক কী অবিবাহিত হিসাবে মনোনীত করার ক্ষমতা একটি দুর্ভাগ্যজনক historicalতিহাসিক পরিস্থিতি is মডেল. আমার বোধগম্যতা হল যে মূলত SYBASE এসকিউএল সার্ভার শারীরিক মডেল থেকে "স্টোরেজটিতে লুকিং কী" হিসাবে গাদা বা ক্লাস্টার ইনডেক্স হিসাবে সর্বদা একটি 4-বাইট রুইআইডি ব্যবহার করে।
কিছু লোক "প্রাথমিক কী" শব্দটি ব্যবহার করে হুবহু একটি পূর্ণসংখ্যা কলাম যা কিছু স্বয়ংক্রিয় প্রক্রিয়া দ্বারা এর মান উত্পন্ন করে mean উদাহরণস্বরূপ AUTO_INCREMENT
, মাইএসকিউএল বা IDENTITY
মাইক্রোসফ্ট এসকিউএল সার্ভারে। আপনি কি এই অর্থে প্রাথমিক কী ব্যবহার করছেন?
যদি তা হয় তবে উত্তরটি আপনি যে ব্র্যান্ডের ডেটাবেস ব্যবহার করছেন তার উপর নির্ভর করে। মাইএসকিউএলে, আপনি এটি করতে পারবেন না, আপনি একটি ত্রুটি পান:
mysql> create table foo (
id int primary key auto_increment,
id2 int auto_increment
);
ERROR 1075 (42000): Incorrect table definition;
there can be only one auto column and it must be defined as a key
অন্যান্য ব্র্যান্ডের ডেটাবেজে আপনি একটি টেবিলের মধ্যে একাধিক স্বয়ংক্রিয় উত্পাদনকারী কলাম সংজ্ঞায়িত করতে সক্ষম।
একই সাথে দুটি প্রাথমিক কী থাকা সম্ভব নয়। তবে (ধরে নিবেন যে আপনি কম্পোজিট কী দিয়ে কেসটি গোলমাল করেননি), একটি বৈশিষ্টকে অনন্য করে তোলার জন্য আপনার যা প্রয়োজন হতে পারে।
CREATE t1(
c1 int NOT NULL,
c2 int NOT NULL UNIQUE,
...,
PRIMARY KEY (c1)
);
তবে মনে রাখবেন যে রিলেশনাল ডাটাবেসে একটি 'সুপার কী' বৈশিষ্ট্যের একটি উপসেট যা অনন্যভাবে একটি টেবিলের একটি টিপল বা সারি সনাক্ত করে। একটি 'কী' এমন একটি 'সুপার কী' যার অতিরিক্ত সম্পত্তি রয়েছে যা কী থেকে কোনও বৈশিষ্ট্য সরিয়ে দেয়, সেই চাবিটিকে আর 'সুপার কী' হিসাবে তৈরি করে না (বা কেবল একটি 'কী' একটি ন্যূনতম সুপার কী)। যদি আরও কী থাকে তবে এগুলি সমস্তই প্রার্থী কী। আমরা প্রার্থী কীগুলির মধ্যে একটিকে প্রাথমিক কী হিসাবে নির্বাচন করি। একারণে একটি সম্পর্ক বা টেবিলের জন্য একাধিক প্রাথমিক কীগুলির বিষয়ে কথা বলা একটি বিরোধ।
একটি প্রাথমিক কী সেই চাবি যা অনন্যভাবে একটি রেকর্ড সনাক্ত করে এবং সমস্ত সূচীতে ব্যবহৃত হয়। একারণে আপনার একাধিক থাকতে পারে না। চাইল্ড টেবিলগুলিতে যোগদানের জন্য এটি সাধারণত কী ব্যবহার করা হয় তবে এটি কোনও প্রয়োজন হয় না। পিকে আসল উদ্দেশ্য হ'ল এটি নিশ্চিত করা যে কোনও কিছু আপনাকে অনন্যভাবে একটি রেকর্ড সনাক্ত করতে দেয় যাতে ডেটা পরিবর্তনগুলি সঠিক রেকর্ডকে প্রভাবিত করে এবং যাতে সূচকগুলি তৈরি করা যায়।
তবে, আপনি একটি প্রাথমিক কীতে (যৌগিক পিকে) একাধিক ক্ষেত্র রাখতে পারেন। এটি আপনার যোগগুলিকে ধীরে ধীরে পরিণত করবে (বিশেষত যদি তারা বৃহত্তর স্ট্রিং ধরণের ক্ষেত্র হয়) এবং আপনার সূচীগুলি আরও বড় হয় তবে এটি কিছু সন্তানের টেবিলে যোগদানের প্রয়োজনীয়তা সরিয়ে ফেলতে পারে, তাই পারফরম্যান্স এবং ডিজাইনের দিক থেকে এটি কেস হিসাবে গ্রহণ করুন by কেস ভিত্তি। আপনি যখন এটি করেন, প্রতিটি ক্ষেত্র নিজেই অনন্য নয়, তবে তাদের সংমিশ্রণটি। যদি একটি যৌগিক কীতে এক বা একাধিক ক্ষেত্রগুলিও অনন্য হওয়া উচিত, তবে আপনার এটিতে একটি অনন্য সূচি প্রয়োজন। এটি সম্ভবত যদি এক ক্ষেত্রটি অনন্য হয় তবে এটি পিকে-র জন্য আরও ভাল প্রার্থী।
এখন সময়ে, আপনার কাছে পিকে একাধিক প্রার্থী থাকে। এক্ষেত্রে আপনি একজনকে পিকে হিসাবে বেছে নেন বা একটি সার্গেট কী ব্যবহার করেন (আমি ব্যক্তিগতভাবে এই উদাহরণের জন্য সারোগেট কীগুলি পছন্দ করি)। এবং (এটি সমালোচনামূলক!) আপনি প্রতিটি প্রার্থী কীতে অনন্য সূচি যোগ করেন যা পিকে হিসাবে বেছে নেওয়া হয়নি। যদি ডেটাটি অনন্য হতে হয় তবে এটির পিকে হোক বা না হোক এটির জন্য একটি অনন্য সূচক প্রয়োজন। এটি একটি ডেটা অখণ্ডতার সমস্যা। (মনে রাখবেন যে আপনি যখন কোনও সার্গেট কী ব্যবহার করেন তখনই এটি সত্য; লোকেরা সারোগেট কীগুলি নিয়ে সমস্যায় পড়ে কারণ তারা প্রার্থী কীগুলিতে অনন্য সূচী তৈরি করতে ভুলে যায়))
মাঝে মাঝে এমন সময় আসে যখন আপনি একাধিক সারোগেট কী (যা সাধারণত পিকে থাকে যদি আপনি সেগুলি পান) চান। এক্ষেত্রে আপনি যা চান সেটি বেশি পিকে নয়, এটি স্বয়ংক্রিয়রিত কীগুলির সাথে আরও ক্ষেত্র। বেশিরভাগ ডিবি এটির অনুমতি দেয় না তবে এর চারপাশে যাওয়ার উপায় রয়েছে। প্রথম ক্ষেত্রটি প্রথম অটো-জেনারেটেড কী (ফিল্ড 1 * -1 উদাহরণস্বরূপ) বা সম্ভবত দ্বিতীয় স্বয়ংক্রিয় জেনারেটেড কীটির প্রয়োজনের ভিত্তিতে দ্বিতীয় ক্ষেত্রটি গণনা করা যেতে পারে কিনা তা বিবেচনা করুন প্রথমে আপনার সম্পর্কিত টেবিল তৈরি করা উচিত। সম্পর্কিত টেবিলগুলি এক-একের সম্পর্কের মধ্যে থাকতে পারে। আপনি চাইল্ড টেবিলের প্যারেন্ট টেবিল থেকে পিকে যোগ করে এবং তারপরে টেবিলে নতুন অটো-জেনারেটেড ফিল্ড যুক্ত করে এবং তারপরে যে কোনও ক্ষেত্র এই টেবিলের জন্য উপযুক্ত তা প্রয়োগ করে আপনি তা প্রয়োগ করবেন। তারপরে দুটি কীগুলির মধ্যে একটিকে পিকে হিসাবে চয়ন করুন এবং অন্যটিতে একটি অনন্য সূচক রাখুন (স্বয়ংক্রিয়রক্ষিত ক্ষেত্রটি পিকে হতে হবে না)। এবং অভিভাবক সারণীতে যে ক্ষেত্রটি রয়েছে সেটিতে এফকে যুক্ত করার বিষয়টি নিশ্চিত করুন। সাধারণভাবে যদি আপনার শিশু টেবিলের জন্য কোনও অতিরিক্ত ক্ষেত্র না থাকে, তবে আপনাকে কেন দুটি স্বয়ংক্রিয় জেনারেটেড ক্ষেত্রের প্রয়োজন বলে মনে করছেন তা আপনাকে পরীক্ষা করতে হবে।
আমার চেয়ে ভাল প্রযুক্তিগত উত্তরগুলি আরও ভালভাবে দেওয়া হয়েছিল। আমি কেবল এই বিষয়টিতে যুক্ত করতে পারি:
আপনি যদি এমন কিছু চান যা অনুমোদিত / গ্রহণযোগ্য নয় তবে এটি পিছনে পদক্ষেপ নেওয়া ভাল কারণ।
আশা করি এটি কাউকে সাহায্য করবে।
হ্যাঁ, এটি এসকিউএল এ সম্ভব, তবে আমরা এমএসএ্যাক্সে একাধিক প্রাথমিক কী সেট করতে পারি না। তারপরে, আমি অন্যান্য ডাটাবেসগুলি সম্পর্কে জানি না।
CREATE TABLE CHAPTER (
BOOK_ISBN VARCHAR(50) NOT NULL,
IDX INT NOT NULL,
TITLE VARCHAR(100) NOT NULL,
NUM_OF_PAGES INT,
PRIMARY KEY (BOOK_ISBN, IDX)
);