কেন লুক টেবিলের প্রাথমিক কী হিসাবে কোনও int ব্যবহার করবেন?


30

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

আমি বুঝতে পারি যে কোনও এনভিচর (50) ব্যবহারের পরিবর্তে কোনও int এর চেয়ে বেশি জায়গা ব্যবহার করা যদি এটি অনেক রেকর্ডের সাথে একটি টেবিলের সাথে যুক্ত থাকে।

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

একটি "প্রাথমিক স্ট্যান্ডার্ড জিনিসটি করা" ব্যতীত একটি প্রাথমিক প্রাথমিক কী (বিশেষত কোনও অনুসন্ধানের টেবিলের জন্য) ব্যবহার করার সুবিধা কী কী?


4
এই 2 টি পূর্ববর্তী প্রশ্নগুলিতে আপনি ভাল তথ্য খুঁজে পেতে পারেন এবং এমনকি আপনার প্রয়োজনীয় উত্তরটি পেতে পারেন: সারণীর সমস্ত কলামের সমন্বয়ে একটি প্রাথমিক কীটির কোনও সুবিধা আছে কি? এবং অক্ষর বনাম পূর্ণসংখ্যার প্রাথমিক কীগুলি
মারিয়ান

উত্তর:


23

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

স্যান্ডির কাছে আপনার মন্তব্যটি কেবল পড়ুন - সম্ভবত এই ক্ষেত্রে আপনি যা চান তা চেক বাধা , কোনও বিদেশী কী / দেখার টেবিল নয়, যেমন:

create table icecream (flavour varchar(10))
go
alter table icecream add constraint ck_flavour check (flavour in ('Orange', 'Pista', 'Mango'))
go
insert into icecream (flavour) values ('Orange')
go
insert into icecream (flavour) values ('Vanilla')
go

এটি চালান এবং আপনি পান:

(1 row(s) affected)
Msg 547, Level 16, State 0, Line 1
The INSERT statement conflicted with the CHECK constraint "ck_flavour". The conflict occurred in database "GAIUSDB", table "dbo.icecream", column 'flavour'.
The statement has been terminated.

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


@ গাইউস- ভাল উদাহরণ ... আমি এই ধরণের দৃশ্যের জন্য চেক বাধা ব্যবহার না করা পছন্দ করি; এটি রক্ষণাবেক্ষণযোগ্য হবে না এর মূল কারণ (আপনি এটিকে অসুবিধায় চিহ্নিত করেছেন)।
কোডারহক

1
@ স্যান্ডি এটি কতটা ঘন ঘন পরিবর্তিত হবে এবং অন্য কোথায় ব্যবহৃত হবে তা ডেটার উপর নির্ভর করে। উদাহরণস্বরূপ, যদি সীমাবদ্ধতা অবশ্যই ডিবি দ্বারা প্রয়োগ করা হয় তবে মানগুলি ড্রপ-ডাউন মেনুটি তৈরি করতে বা কোনও প্রতিবেদনে ব্যবহৃত হতে পারে, তবে একটি বিদেশী কী আরও উপযুক্ত। যেভাবেই হোক না কেন, আমি অ্যাপ্লিকেশনটিতে এটি করার বিরুদ্ধে পরামর্শ দেব।
গাইউস

7

"অনুসন্ধানের মানটি সরাসরি ব্যবহার করা হচ্ছে" - এটি সন্ধানের সারণির প্রকৃত উদ্দেশ্যটির সাথে কিছুটা বিপরীত। এমন টেবিলে রাখছেন কেন? যদি এটি তাকান না হয়।
আমি আপনার প্রশ্ন ভুল বুঝতে পারে। এখানে এমএসডিএন থেকে একটি সারণী সংজ্ঞা দেওয়া আছে

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

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

গন্ধ টেবিল

Orange  
Pista  
Mango

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


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

@ জ্যাকো বেরিয়ার্স - গাইউসের উত্তর দেখুন ...
প্রতিবন্ধকতা

7

আপনি যেহেতু আপনার প্রশ্নটি 'বিশেষত কোনও অনুসন্ধানের টেবিলের জন্য' দিয়ে যোগ্য করেছেন তাই উত্তরটি সম্ভবত 'স্থান বাঁচায়' এর জন্য সহজ করা হয়েছে।

আমি মনে করি আপনি যদি এই যোগ্যতাটি অপসারণ করেন তবে আপনার প্রশ্নটি 'প্রাকৃতিক কীগুলির চেয়ে সরোগেট কী ব্যবহার করবেন কেন?' সরোগেট কীগুলির সমর্থনে আমি নিম্নলিখিতটি লিখেছি :

"বিস্তৃত যৌগিক কীটির পরিবর্তে একটি পূর্ণসংখ্যার মান স্থানান্তরিত করার ফলে অনেকগুলি সুবিধা রয়েছে by এটি ফিজিক্যাল মডেল জুড়ে দুর্দান্ত ধারাবাহিকতা সরবরাহ করে এবং বৃহত্তর তার ব্যয়ের চেয়ে আরও বেশি জায়গা বাঁচায় এবং মিশ্রণ কীগুলি স্থানান্তরের তুলনায় যখন I / O হ্রাস করে; বিশেষত একটি ভাল - মডেলকে নরমালাইজ করা হয়েছে Additionally অতিরিক্ত হিসাবে, তারা একটি মডেল এবং কোয়েরিতে যোগদানের বোঝা সহজ করে ify "

এটি বেশিরভাগ ক্ষেত্রেই "করণীয় আদর্শ জিনিস" হয়ে উঠেছে। দুর্ভাগ্যজনক দ্বি-পণ্য হ'ল লোকেরা একটি সারোগেট কী চাপায় এবং প্রার্থী কী কী তা ভাবেন না ... তবে এখন আমরা আপনার প্রশ্নের বাইরে যাচ্ছি :)


3

আমি সবসময় ব্যবহার করার একটি কারণ হ'ল যদি কেউ অনুসন্ধানের টেবিলে কোনও মান ভুল করে বানিয়ে থাকে তবে অরেঞ্জের পরিবর্তে ওরেঙ্গ বলুন, অনুসন্ধানের টেবিলে মানটি পরিবর্তন করা এত সহজ।

একটি সংখ্যা প্রাথমিক কী সহ লুকিং টেবিলটির জন্য কেবলমাত্র অনুসন্ধান সারণিতে মান পরিবর্তন করতে হবে।

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


2

আপনি যখন আইডি সংজ্ঞায়িত করেন, আপনি স্বতন্ত্রতার গ্যারান্টিও দিতে পারেন। তবে আপনি যখন উদাহরণস্বরূপ ইমেলটি অনন্য শনাক্তকারী হিসাবে গ্রহণ করেন, আপনি স্বতন্ত্রতার দায়িত্বটিকে অবিশ্বস্ত তৃতীয় পক্ষের দিকে নিয়ে যান।

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