একটি অনন্য বাধা কেন কেবল একটি নূলে অনুমতি দেয়?


36

প্রযুক্তিগতভাবে, NULL = NULL মিথ্যা, সেই যুক্তি অনুসারে কোনও NULL কোনও NUL এর সমান নয় এবং সমস্ত NULL আলাদা। এর অর্থ কি এই বোঝা যায় না যে সমস্ত NULs অনন্য এবং একটি অনন্য সূচককে NUL এর কোনও সংখ্যার অনুমতি দেওয়া উচিত?


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
পল হোয়াইট GoFundMonica বলেছেন

উত্তর:


52

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

এটি খুব স্মার্ট সিদ্ধান্ত ছিল না। তাদের যা করা উচিত ছিল তা হ'ল এএনএসআই স্ট্যান্ডার্ডের ডিফল্ট আচরণটি মেনে চলা এবং যদি তারা সত্যিই এই অদ্ভুত আচরণটি চায়, তবে ডিডিএল বিকল্পের মতো WITH CONSIDER_NULLS_EQUALবা এর মাধ্যমে অনুমতি দিন WITH ALLOW_ONLY_ONE_NULL

অবশ্যই, হ্যান্ডসাইট 20/20।

এবং আমাদের কাছে এখন একদম কাজ আছে, যাইহোক, যদিও এটি সবচেয়ে পরিষ্কার বা স্বজ্ঞাত নয়।

আপনি এসকিউএল সার্ভার ২০০৮ এবং তারপরে একটি অনন্য, ফিল্টারড সূচক তৈরি করে যথাযথ এএনএসআই আচরণ পেতে পারেন।

CREATE UNIQUE INDEX foo ON dbo.bar(key) WHERE key IS NOT NULL;

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


8

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


1
এই (এসকিউএল-সার্ভারের) প্রযুক্তিগত দিকটি এসকিউএল স্ট্যান্ডার্ডের সাথেও খাপ খায় না। এই সমস্যাটি সম্পর্কে একটি 7 বছরের পুরানো কানেক্ট আইটেম রয়েছে
ypercubeᵀᴹ

@ টাইপ्यूब সত্য এ কারণেই আমি বলেছিলাম এটি কেবল বাস্তবায়ন এবং NUL এর সংজ্ঞাটির সাথে সত্যই খাপ খায় না। আমি ফিল্টার করা অনন্য সূচক সম্পর্কে চিন্তা করিনি (যদিও আমি এটি অন্যান্য জিনিসের জন্য ব্যবহার করেছি।)
কেনেথ ফিশার

3

প্রথম - "নাল মান" শব্দটি ব্যবহার করা বন্ধ করুন, এটি আপনাকে কেবল পথভ্রষ্ট করবে। পরিবর্তে, "নাল মার্কার" বাক্যাংশটি ব্যবহার করুন - একটি কলামে চিহ্নিত একটি মার্কার যা এই কলামের আসল মানটি অনুপস্থিত বা অগ্রহণযোগ্য (তবে লক্ষ করুন যে চিহ্নিতকারীটি সেই বিকল্পগুলির মধ্যে আসলে কোনটি ক্ষেত্রে ক্ষেত্রে নেই)।

এখন, নিম্নলিখিতটি কল্পনা করুন (যেখানে ডাটাবেসের মডেল পরিস্থিতি সম্পর্কে সম্পূর্ণ জ্ঞান নেই)।

Situation          Database

ID   Code          ID   Code
--   -----         --   -----
1    A             1    A
2    B             2    (null)
3    C             3    C
4    B             4    (null)

আমরা যে সততা বিধি মডেলিং করছি তা হ'ল "কোডটি অবশ্যই অনন্য হওয়া উচিত"। বাস্তব-বিশ্বের পরিস্থিতি এটিকে লঙ্ঘন করে, তাই ডাটাবেস 2 এবং 4 উভয় আইটেমকে একই সময়ে টেবিলে থাকতে দেবে না।

সবচেয়ে নিরাপদ এবং স্বল্পতম-নমনীয়, পদ্ধতির ক্ষেত্রে কোড ক্ষেত্রে নাল চিহ্নিতকারীদের বারণ করা হবে, সুতরাং অসামঞ্জস্যপূর্ণ ডেটার কোনও সম্ভাবনা নেই। সর্বাধিক নমনীয় পদ্ধতি হ'ল একাধিক নাল চিহ্নিতকারীকে অনুমতি দেওয়া এবং মানগুলি প্রবেশ করার সময় স্বতন্ত্রতা সম্পর্কে চিন্তা করা worry

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


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

পিএস নাল সম্পর্কে আমার প্রিয় উক্তি: লুই ডেভিডসন, "প্রফেশনাল এসকিউএল সার্ভার 2000 ডেটাবেস ডিজাইন", রোকস প্রেস, 2001, পৃষ্ঠা 52 "


1
একককে অনুমতি দেওয়াও nullএই লক্ষ্য অর্জন করে না। কারণ অনুপস্থিত মানটি অন্য সারির একটির মানের মতো হতে পারে।
মার্টিন স্মিথ

1
@ মার্টিনস্মিত কি বলেছে। আপনার যদি চেক সীমাবদ্ধতা থাকে CHECK (Value IN ('A','B','C','D'))? তারপরে এসকিউএল-সার্ভারের প্রয়োগকরণ এবং এসকিউএল স্ট্যান্ডার্ড উভয়ই সারণীতে 5 টি সারি রাখার অনুমতি দেয় (প্রতিটি মানের জন্য একটি সারি NULL সহ 1)। তারপরে, তাত্ক্ষণিকভাবে, যখন ডাটাবেসটি তার সীমাবদ্ধতার সাথে সামঞ্জস্যপূর্ণ, এটি ডিজাইনারের অভিপ্রায়ের সাথে সামঞ্জস্যপূর্ণ নয় সারণিটি সর্বোচ্চ 4 টি সারি রয়েছে। এক বা একাধিক সারি মুছে ফেলা না হয় এমন কোনও মূল্য নেই যে নূলে পরিবর্তন করা যেতে পারে যা কোনও সীমাবদ্ধতা লঙ্ঘন করবে না।
ypercubeᵀᴹ

1
মানকটি 5 এর পরিবর্তে 6 টি এমনকি 106 টি সারির অনুমতি দেবে তা পরিবর্তিত হয় না যে তারা উভয়ই এই দৃশ্যে কিছুটা ব্যর্থ হয়েছে।
ypercubeᵀᴹ

@ মার্টিন স্মিথ, এটি হতে পারে তবে আবার, এটি নাও হতে পারে - ডাটাবেস সার্ভারটি এটি বলতে পারে না যাতে এটি ঝুঁকি না নিয়ে নিরাপদ রুট নেয়। সাইব্যাস (আমি অনুমান করি) প্রোগ্রামাররা ঠিক সেভাবেই সিদ্ধান্ত নিয়েছিল, যেহেতু তখন থেকেই বিরক্তি সৃষ্টি হয়েছিল (অন্ততপক্ষে এসকিউএল সার্ভার .5.৫ হিসাবে আমার বইয়ের শেলফের প্রাচীনতম বই, যেখানে রন সৌকআপ তার উত্তরটিতে অ্যারন বার্ট্র্যান্ডের মত একই মন্তব্য করেছে) । আমার ধারণা এটি আরও খারাপ হতে পারে - তারা কোনও নাল চিহ্নিতকারীকে বাধ্যতামূলক করতে পারে। :-)
গ্রীনস্টোন ওয়াকার

2
@ গ্রীনস্টোনওয়াকার - এটি "নিরাপদ" রুট নেয় না। এটি ধরে নেওয়া হয় যে অনুপস্থিত মান দ্বন্দ্ব করবে না। CREATE TABLE #T(A INT NULL UNIQUE);INSERT INTO #T VALUES (1),(NULL);UPDATE #T SET A = 1 WHERE A IS NULL;একটি ত্রুটি উত্থাপন করবে। আপনার নকশা প্রেরণার তত্ত্ব অনুসারে NULLএটি প্রথম ক্ষেত্রে সন্নিবেশকে বাধা দেওয়া উচিত ছিল - কারণ অসম্পূর্ণ জ্ঞানের অর্থ মান আলাদা হওয়ার কোনও গ্যারান্টি নেই।
মার্টিন স্মিথ

2

এটি প্রযুক্তিগতভাবে সঠিক নাও হতে পারে, তবে দার্শনিকভাবে এটি আমাকে রাতে ঘুমাতে সহায়তা করে ...

অন্য অনেকে যেমন বলেছেন বা ইঙ্গিত করেছেন, আপনি যদি NUL কে অজানা হিসাবে ভাবেন, তবে আপনি নির্ধারণ করতে পারবেন না যে একটি NULL মান আসলে অন্য NULL মানের সমান whether এটিকে এভাবে ভাবতে ভাবতে NULL == NULL অভিব্যক্তিটি NULL এর কাছে মূল্যায়ন করা উচিত, যার অর্থ অজানা।

কলাম মানগুলির তুলনা করার জন্য একটি অনন্য প্রতিবন্ধকতার একটি নির্দিষ্ট মান প্রয়োজন need অন্য কথায়, সাম্যতা অপারেটরটি ব্যবহার করে অন্য কোনও কলামের মানের সাথে একক কলাম মানকে তুলনা করার সময়, এটি অবশ্যই বৈধ হওয়ার জন্য মিথ্যাতে মূল্যায়ন করতে হবে। অজানা সত্যই মিথ্যা নয় যদিও এটি প্রায়শই মিথ্যা হিসাবে বিবেচিত হয়। দুটি নূন্যমূল্য সমান হতে পারে, নাও ... এটি কেবল নির্ধারিতভাবে নির্ধারণ করা যায় না।

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

SELECT * from dbo.table1 WHERE ColumnWithUniqueContraint="some value"

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

এটি দেওয়া, আমি বিশ্বাস করি যে এটি NUL এর সংজ্ঞা সম্মানের সাথে সঠিকভাবে প্রয়োগ করা হয়েছে বা না করুক না কেন, বেশিরভাগ পরিস্থিতিতে এটি একাধিক NULL মানকে অনুমোদনের চেয়ে অবশ্যই অনেক বেশি ব্যবহারিক।


আপনার নির্বাচনটি 1 টি ফলাফল দেবে, যখন কোনও অনন্য বাধা থাকবে (কোনও প্রয়োগে কেবল এসকিউএল-সার্ভার নয়)। তোমার যুক্তি কী?
ypercubeᵀᴹ

-3

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

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

অন্যথায়, আমি UNIQUEঅনেকগুলি অভিন্ন রেকর্ডের অস্তিত্বের অনুমতি দেওয়ার জন্য কোনও কলামে একটি সীমাবদ্ধতা সহ একটি ডাটাবেসের কোনও ভিত্তি দেখতে পাচ্ছি না , তবে আমি এমন একাধিক রেকর্ডের অনুমতি দিচ্ছি যার মূল মানগুলি পৃথক নয়। NULLএটি নিজের সমান নয় বলে ঘোষণা করা NULLমান একে অপরের থেকে পৃথক করে তুলবে না ।


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

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

@ অ্যারোনবার্ট্র্যান্ড: এমন কিছু ক্ষেত্রে রয়েছে যেখানে সম্ভবত একটি শূন্য অনন্য ক্ষেত্রের প্রয়োজন হবে সরোগেট কীটি ক্ষেত্রটি পপুলিংয়ের আগেই প্রতিষ্ঠিত করা যায়নি (যেমন "স্বামী আইডি") তবে এমন পরিস্থিতিতে যে "অনন্য" সীমাবদ্ধতা অপর্যাপ্ত হবে; এটি প্রয়োজনীয় হবে যে এক্স.স্প্পহাউস নন-শূন্য থাকলে X.Spouse.Spouse = এক্স। ঘটনাক্রমে, "স্ত্রী" এর মতো কিছু এই বিষয়টি দ্বারা পরিচালিতও হতে পারে যে অবিবাহিত ব্যক্তির রেকর্ডটিতে স্ত্রী হিসাবে "NULL" থাকা উচিত নয়, বরং তার নিজস্ব আইডি থাকতে পারে, এই ক্ষেত্রে X.spouse.spouse = এক্স নিয়ম থাকতে পারে সবার জন্য প্রয়োগ
সুপারক্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.