আমার একাধিক কলাম প্রাথমিক কীগুলি ব্যবহার করা উচিত বা একটি নতুন কলাম যুক্ত করা উচিত?


15

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

সুতরাং এই পদ্ধতির মধ্যে আমি যে অসুবিধাগুলি দেখতে পাচ্ছি বা একটি একক কলাম কী চাইবার কারণগুলি কী কী?


2
আমি জানি না, আমার মনে হয় এসও-তে এটি আরও ভাল হত।
হতাশ

2
@ ফ্রাস্ট্রেটেড উইথফর্মস ডিজাইনার এটি এসও যেতে পারে, তবে আমি মনে করি এটি এখানেও কাজ করে, যেহেতু এই প্রশ্নটির কেন্দ্রবিন্দু "আমি কীভাবে এক্স করব?" এর পরিবর্তে "এই পদ্ধতির কী কী উপকারিতা" তার দিকেই রয়েছে বলে মনে হচ্ছে।
অ্যাডাম শিখুন

@ আনা লার ♦: ডিজাইনের সিদ্ধান্ত সম্পর্কে এটি একটি "উপকারিতা" এবং এর কোডিংয়ের উপর প্রত্যক্ষ এবং সুনির্দিষ্ট প্রভাব পড়বে, তাই আমার ধারণা এসও আরও ভাল জায়গা হবে।
হতাশ

উত্তর:


8

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

আসুন এক কল্পিতাকে অনেকের কাছে সম্পর্কের দিকে নজর দেওয়া যাক:

শিক্ষার্থী * --- * ক্লাস

(একজন শিক্ষার্থী একাধিক ক্লাসে থাকতে পারে, একটি শ্রেণিতে একাধিক শিক্ষার্থী থাকতে পারে)।

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

শিক্ষার্থী 1 --- * তালিকাভুক্তি --- --- 1 শ্রেণি

(একজন শিক্ষার্থীর অনেক এনরোলমেন্ট থাকতে পারে, প্রতিটি তালিকাভুক্তি একটি শ্রেণির জন্য হয় (বা একটি শ্রেণীর বিপরীত পথে যেতে পারে অনেক এনরোলমেন্ট থাকতে পারে, প্রতিটি নথিভুক্ত একটি শিক্ষার্থীর জন্য)।

এখন আপনি এই জাতীয় জিনিসগুলি জিজ্ঞাসা করতে পারেন, গত বছর কেমিস্ট্রি 101 টি শ্রেণিতে কতজন শিক্ষার্থী ভর্তি হয়েছিল? বা অ্যাকমে বিশ্ববিদ্যালয়ে পড়ার সময় জন জন ডো কী ক্লাসে ভর্তি হয়েছিল? পৃথক প্রাথমিক কী ছাড়াই এটি সম্ভব ছিল, তবে একবার আপনার যদি তালিকাভুক্তির জন্য প্রাথমিক কী থাকে তবে একটি সহজ কোয়েরি এই তালিকাভুক্তির (আইডি দ্বারা) হতে পারে, কতজন শিক্ষার্থী উত্তীর্ণ গ্রেড পেয়েছে?

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


1
সুতরাং আপনি এটিকে স্টুডেন্ট ক্লাস টেবিলে যুক্ত করবেন। এই মুহুর্তে, স্টুডেন্ট ক্লাস একটি অনন্য সত্তায় পরিণত হয়েছে ... এবং এটিকে যেমন এনরোলমেন্ট হিসাবে স্বীকৃতি দেওয়ার জন্য একটি নাম দেওয়া উচিত। এটি এত সাধারণ জিনিস, তবে এটি করার মতো অনেক মূল্য আছে!
বোটিস

8

এটি পৃথক আইডি কলাম থাকার অর্থ বোধ করে। আপনি যখন আপনার ডাটাবেস টেবিল থেকে কিছু পেতে চান, এটি করা সহজ:

SELECT whatever FROM table WHERE id=13

কল টেবিল থেকে যাই হোক না কেন নির্বাচন করুন যেখানে কল 1 = 'ভাল 1' এবং কোল 2 = 'ভাল 2' এবং কোল 3 = 'ভাল 3'

উদাহরণস্বরূপ, একটি ওয়েব অ্যাপ্লিকেশনটিতে এটি এমন একটি url এ অনুবাদ করে:

www.somewebsite.com/somepage.php?id=13

বা এই মত:

www.somewebsite.com/somepage.php?col1=val1&col2=val2&col3=val3

4
আপনি যখন কোনও
আইডিতে

3
দুঃখিত, এ মুহূর্তে আমাকে -1 করতে হবে, এ হিসাবে ) এটি কালো এবং সাদা নয়। একটি আইডি কলাম যুক্ত করার সাথে নেতিবাচক জিনিসগুলি আসে যেখানে আপনি কখন এবং কখন নতুন আইডি তৈরি করেন। উপরন্তু, এটি অতিরিক্ত যোগদান বা কোয়েরিতে ফলাফল হতে পারে SELECT। এবং, বি) , আমার আসলে কোনও ধারণা নেই যে এটি কীভাবে আসলে কোনও ধরণের ইউআরএল প্রয়োজনীয়তা তৈরি করে (যদি না আপনি একটি খারাপ কাঠামো নিয়ে কাজ করছেন)। আমার ইউআরএলগুলিতে কোনও কোয়েরি স্ট্রিং ?id=13নেই, একা ছেড়ে দিন ?col1=val1&col2=val2&col3=val3
নিকোল

2
@ রেনেসিস: এই সাইটে ইউআরএল থাকা অনন্য প্রশ্ন এবং ব্যবহারকারী রয়েছে। যদিও, এটি কিছুটা বিশেষ ক্ষেত্রে, কারণ সেই নির্দিষ্ট ডেটা পরিবর্তন হয় না।
মাইকেল কে

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

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

8

মূলত আপনি জিজ্ঞাসা করছেন আপনার সরোগেট বা প্রাকৃতিক কী ব্যবহার করা উচিত (আপনার ক্ষেত্রে এটি সংমিশ্রিত প্রাকৃতিক কীগুলির মতো মনে হয় )। এখানে একটি দুর্দান্ত নিবন্ধ: http://www.agiledata.org/essays/keys.html

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

উদাহরণস্বরূপ, ধরা যাক আপনার দুটি সত্তা রয়েছে: ঠিকানা এবং দেশ।

  • সম্পর্কটি হল: ঠিকানা * ----- 1 দেশ
  • দেশ সত্তা মূলত একটি মূল: মূল্য জোড়া (উদাঃ মার্কিন: মার্কিন যুক্তরাষ্ট্র, সিএ: কানাডা, এমএক্স: মেক্সিকো, ইত্যাদি ...)
  • মার্কিন যুক্তরাষ্ট্রের সমস্ত ঠিকানাগুলির জন্য এই কাঠামোটি জিজ্ঞাসা করতে:

select * from Address where CountryCode = 'US'

  • সারোগেট কীগুলির সাথে একই কোয়েরি সম্পাদন করতে:

select Address.* from Address join Country on Address.CountryID = Country.ID where Country.Code = 'US'

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


5

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


1

আমি প্রতিটি টেবিলে সর্বদা একটি সারোগেট প্রাথমিক কী রাখতে চাই like তবে আমি শুনেছি এটি প্রয়োগের জন্য অনেকগুলি "শক্ত" কারণ নেই।

একবারে যখন আমি একাধিক কলামে প্রাকৃতিক কী কামড়েছিলাম তখন ওআরএম ছিল M মাঝে মাঝে লিঙ্ক টু সত্তা ব্যবহার করে আমার একাধিক কলাম প্রাথমিক কী নিয়ে সমস্যা হবে।


1

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

আপনি সর্বদা অনন্য মানগুলি পরিচালনা করতে অন্য সূচক তৈরি করতে পারেন।

পারফরম্যান্স বেশিরভাগ ক্ষেত্রে সম্ভবত নগণ্য, তবে আপনি আপনার প্রশ্নগুলি সুর্যাগেট কী সহ বা না করে পরীক্ষা করতে পারেন।


0

আমার কাছে পৃথক কী ম্যান্ডেট করার উপযুক্ত কারণটি উপস্থিত হওয়া কঠিন বলে মনে হয় তবে আপনি যেমন বলেছিলেন যে প্রচুর লোকেরা এটিকে রেখেছেন।

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


0

পিকে একটি স্বতঃসংশোধক হওয়াটা ঝামেলা হ্রাস করে যদি আপনি দেখতে পান যে আপনার যৌগিক কীটি বাস্তবে ডুপ্লিকেট থাকতে পারে।


0

টাস টমকে নিয়ে ২০০২ এ আবার একটি ভাল আলোচনা চলছে । এটি ওরাকল-নির্দিষ্ট, তবে বৃহত্তর আলোচনাটি আপনি যে কোনও ডাটাবেস ব্যবহার করছেন তা প্রাসঙ্গিক।

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