যৌগিক প্রাথমিক কীগুলি কীভাবে তৈরি করতে হয় - এমওয়াইএসকিউএল


181

এখানে আমি নিবিড় সেটআপের সাথে কাজ করছি তার একটি স্থূল ওভারসিম্প্লিফিকেশন। table_1এবং table_2উভয়ের আইডি হিসাবে অটো-ইনক্রিমেন্ট সারোগেট প্রাথমিক কী রয়েছে। infoএমন একটি টেবিল যা উভয় সম্পর্কে তথ্য table_1এবং table_2

table_1 (id, field)  
table_2 (id, field, field)
info ( ???, field)

আমি সিদ্ধান্ত নেওয়ার চেষ্টা করছি যে আমাকে এবং infoথেকে আইডির সংমিশ্রণের প্রাথমিক কী তৈরি করা উচিত কিনা । আমি যদি এটি করতাম তবে এর মধ্যে কোনটি সর্বাধিক অর্থপূর্ণ? (এই উদাহরণে আমি আইডি 11209 আইডি 437 এর সাথে সংযুক্ত করছি)table_1table_2

INT(9)11209437 (আমি এটি কেন খারাপ তা কল্পনা করতে পারি)
VARCHAR (10) 11209-437
DECIMAL (10,4)11209.437

অথবা অন্য কিছু?

এটি কোনও মাইএসকিউএল মাইসাম ডিবিতে প্রাইমারি কী হিসাবে ব্যবহার করা ভাল?


উত্তর:


341

আমি একটি সংমিশ্রণ (বহু-কলাম) কী ব্যবহার করব।

CREATE TABLE INFO (
    t1ID INT,
    t2ID INT,
    PRIMARY KEY (t1ID, t2ID)
) 

এইভাবে আপনার বিদেশী কী হিসাবে তাদের নিজ নিজ টেবিলগুলিতে ইশারা করে t1ID এবং t2ID থাকতে পারে।


2
ওহ বাহ সুতরাং আপনি কীভাবে একটি সংমিশ্রিত কী তৈরি করেন! দেখে মনে হচ্ছে আমি ধারণাকে পুরোপুরি ভুল বুঝছি। ধন্যবাদ!! সুতরাং এর মতো কিছু সম্পূর্ণরূপে ইনডেক্সিং উদ্দেশ্যে হয় তবে সঠিক? আমি যেমন এই সংমিশ্রণটি ব্যবহার করে কোনও রেকর্ডটি উল্লেখ করতে সক্ষম হব না, তখনও আমাকে এমনটি করতে হবে UPDATE info ... WHERE t1ID=11209 AND t2ID=437?
ফিলিপ করুন

2
সঠিক। যদিও উভয় কলামই অনন্য হওয়া উচিত, যেখানে t1ID = 11209 সম্ভবত যথেষ্ট হবে।
অ্যালেক্সকুস

39
@ অ্যালেক্সকুস উভয় কলামের সংমিশ্রণটি অনন্য, তবে t1ID = 11209 এর জন্য অনেকগুলি টি 2 আইডি থাকতে পারে।
e18r

21

আমি "তথ্য" টেবিলের প্রাথমিক কীটি অন্য টেবিল থেকে দুটি মানের সংমিশ্রণ করব না।

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

আমি এগুলি সর্বদা দুটি স্বতন্ত্র কলাম হিসাবে রাখব। আপনি মাইএসকিএলে একটি দ্বি-কলামের প্রাইমী কী ব্যবহার করতে পারেন ... প্রাথমিক কী (আইডি_এ, আইডি_বি) ... তবে আমি একটি দ্বি-কলামের অনন্য সূচকটি ব্যবহার করতে পছন্দ করি এবং একটি স্বয়ংক্রিয়-বৃদ্ধি প্রাথমিক কী ক্ষেত্র থাকা পছন্দ করি।


1
স্বতন্ত্র কলামগুলি রাখার বিষয়ে আপনি একদম ঠিক। আমি অসচেতন ছিলাম যে আপনার দ্বি-কলামের অনন্য সূচক থাকতে পারে এবং আমি মনে করি এটি আমার পক্ষে আসলে একটি ভাল বিকল্প হতে পারে। আপনি এখনও কেন প্রাথমিক কীটিকে স্বতঃবৃদ্ধি হিসাবে রাখতে পছন্দ করবেন তা জিজ্ঞাসা করতে পারি?
ফিলিপ করুন

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

ধন্যবাদ. আমি মনে করি আপনার
বক্তব্যটি

1
আমার মাথার উপরে থেকে একটি কারণ অনুমান করা হয় যে আপনি সম্পর্কের টেবিলটি তৈরি করতে চান। আপনার কাছে তিনটি টেবিল রয়েছে, বাজারের স্থান, মুদ্রা এবং সরবরাহকারী বলুন, সরবরাহকারী কেবলমাত্র বাজারের জায়গায় কেবলমাত্র বিদ্যমান থাকতে পারে, সুতরাং আপনার সম্পর্কের টেবিলটি কেবল একটি মুদ্রা সরবরাহ করতে পারে, তাই আপনি সম্মিলিত (আইডি_মার্কেট, আইডি_প্রোভিডার) অর্থ আপনি কেবল তৈরি করতে পারেন সেই সংযোগটি একবার, আবার একই বাজার এবং সরবরাহকারীকে এক সাথে যুক্ত করার চেষ্টা ব্যর্থ হবে, যার অর্থ তারা অনন্য, তারপরে আপনার একটি দ্বিতীয় কলাম হবে, id_currency বলুন, অর্থ মুদ্রা পুরো টেবিলের মধ্যে একবচন, এর অর্থ কী?
ক্রিস্টোফার থমাস

1
যে কেউ এই থ্রেডটি পরে দেখেন, দয়া করে মনে রাখবেন যে এটি খারাপ অভ্যাসের কারণ এটি ডেটাবেস ডিজাইনের একটি খুব প্রাথমিক নীতি লঙ্ঘন করে। 1 ম সাধারণ ফর্মটির প্রতিটি তথ্যের টুকরোটির নিজস্ব কলাম থাকতে হবে। এটি এবং আপনার ডাটাবেস কাঠামোর স্বাভাবিককরণের একাধিক সুবিধা লঙ্ঘনের কোনও কারণ নেই।
স্মাকজোনগুলি 21'7

15

বাক্য গঠন CONSTRAINT constraint_name PRIMARY KEY(col1,col2,col3)উদাহরণস্বরূপ ::

CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)

উপরের উদাহরণটি যদি আপনি টেবিল তৈরি করার সময় এটি রচনা করে থাকেন তবে কাজ করবে ::

CREATE TABLE person (
   P_Id int ,
   ............,
   ............,
   CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
);

বিদ্যমান সারণিতে এই সীমাবদ্ধতা যুক্ত করতে আপনাকে নিম্নলিখিত বাক্য গঠনটি অনুসরণ করতে হবে

ALTER TABLE table_name ADD CONSTRAINT constraint_name PRIMARY KEY (P_Id,LastName)

8

মনে করুন আপনি ইতিমধ্যে একটি টেবিল তৈরি করেছেন এখন আপনি এই ক্যোয়ারীটি যৌগিক প্রাথমিক কী তৈরি করতে ব্যবহার করতে পারেন

alter table employee add primary key(emp_id,emp_name);

5

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

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

ডাটাবেস যদি একটি গতিশীল ওয়েব পৃষ্ঠা চালিত করে তবে একটি দ্বি-ক্ষেত্রের সংমিশ্রণে ক্যোয়ারী কোড লিখতে স্বায়ত্তশাসিত কীটি বের করা / পুনরায় জমা দেওয়ার চেয়ে সহজ হতে পারে।

সুতরাং আমি মূল প্রশ্নের উত্তর দিচ্ছি না, আমি অবশ্যই অ্যাডামের সরাসরি উত্তর প্রশংসা করি।


4

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



1

@ অ্যালেক্সকিউজ আমি আপনার উত্তরে মন্তব্য হিসাবে এটি যুক্ত করতে চেয়েছিলাম কিন্তু মন্তব্যে নতুন লাইন যুক্ত করার একাধিক ব্যর্থ প্রচেষ্টা করার পরে ছেড়ে দিয়েছি।

এটি বলেছিল, টি 1 আইডিটি টেবিল_1 এ অনন্য তবে এটি আইএনএফও টেবিলেও এটি অনন্য করে তোলে না।

উদাহরণ স্বরূপ:

সারণী_1 এ রয়েছে:
আইডি ফিল্ড
1 এ
2 বি

সারণী 2- তে রয়েছে:
আইডি ফিল্ড
1 এক্স
2 ওয়াই

INFO এর পরে থাকতে পারে:
t1ID t2ID ক্ষেত্র
1 1 কিছু
1 2 ডেটা
2 1 ইন-প্রতি
2 2 সারি

সুতরাং INFO টেবিলটিতে স্বতন্ত্রভাবে একটি সারি সনাক্ত করতে আপনার জন্য T1ID এবং t2ID উভয়ই দরকার


এর বলা যৌগিক কী
পাভেল পি

1
@ পাভেলপ আমার উত্তরটি অ্যালেক্সের মন্তব্যকে মন্তব্য করেছেন "যদিও যেহেতু উভয় কলামই অনন্য হওয়া উচিত, যেখানে t1ID = 11209 সম্ভবত যথেষ্ট হবে।" ... আমি সম্মত হই যে সম্মিলিত কী ব্যবহার করা সঠিক তবে সঠিক মিলটি সনাক্ত করতে আপনার জন্য টি 1 আইডি এবং টি 2 আইডি উভয়ের প্রয়োজন হবে ... আমি আশা করি এটি এখন পরিষ্কার হয়ে গেছে।
তিরস্কার করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.