কড়া কথায় বলতে গেলে, একটি অনন্য কলাম কলাম (বা কলামগুলির সেট) কেবল একবারে NULL (বা NULL এর একটি রেকর্ড) হতে পারে, যেহেতু একই মান (এবং এটিতে NULL অন্তর্ভুক্ত) একাধিকবার স্পষ্টতই অনন্য সীমাবদ্ধতা লঙ্ঘন করে।
তবে, এর অর্থ এই নয় যে "অনন্য nullable কলাম" ধারণাটি বৈধ; এটি যে কোনও রিলেশনাল ডাটাবেসে বাস্তবায়িত করার জন্য আমাদের কেবল মনে রাখতে হবে যে এই ধরণের ডাটাবেসগুলি সঠিকভাবে কাজ করার জন্য সাধারণকরণ হিসাবে বোঝানো হয়েছে, এবং সাধারণীকরণ সাধারণত সত্ত্বার মধ্যে সম্পর্ক স্থাপনের জন্য বিভিন্ন (অ-সত্তা) অতিরিক্ত টেবিল যুক্ত করে থাকে ।
আসুন কেবলমাত্র একটি "অনন্য nullable কলাম" বিবেচনা করে একটি বেসিক উদাহরণ কাজ করুন, এটি আরও এই জাতীয় কলামগুলিতে প্রসারিত করা সহজ।
মনে করুন আমরা কোনও টেবিলে প্রতিনিধিত্ব করে তথ্যগুলি:
create table the_entity_incorrect
(
id integer,
uniqnull integer null, /* we want this to be "unique and nullable" */
primary key (id)
);
আমরা ইউনিকুলকে আলাদা করে রেখে এবং এককনুল মান এবং the_entity (একচেটিয়া "the_entity এর ভিতরে" এককনাল থাকার চেয়ে) সম্পর্ক স্থাপনের জন্য একটি দ্বিতীয় সারণী যুক্ত করে এটি করতে পারি:
create table the_entity
(
id integer,
primary key(id)
);
create table the_relation
(
the_entity_id integer not null,
uniqnull integer not null,
unique(the_entity_id),
unique(uniqnull),
/* primary key can be both or either of the_entity_id or uniqnull */
primary key (the_entity_id, uniqnull),
foreign key (the_entity_id) references the_entity(id)
);
ইউনিট-এর মানটিকে একটি সারিতে একটি_ সারিবদ্ধভাবে সংযুক্ত করার জন্য আমাদেরও_সংশ্লিষ্টতার মধ্যে একটি সারি যুক্ত করতে হবে।
The_entity এর সারিগুলির জন্য কোনও অদ্বিতীয় মান যুক্ত ছিল না (যেমন আমরা সেই_উত্তর_অনুষ্ঠানে NULL রাখব) তার জন্য আমরা কেবল_সংশ্লিষ্টতার সাথে একটি সারি যুক্ত করি না।
নোট করুন যে ইউনিকুলের জন্য মানগুলি সমস্ত_সম্পর্ক সম্পর্কিত স্বতন্ত্র হবে এবং এটিও লক্ষ্য করুন যে_েনটিটির প্রতিটি মানের ক্ষেত্রে_আরলেশনটিতে সর্বাধিক এক মান থাকতে পারে, যেহেতু এটিতে প্রাথমিক এবং বিদেশী কীগুলি এটি প্রয়োগ করে।
তারপরে, ইউনিকনুলের জন্য যদি 5 এর মান 3 এর একটি_পরিচয় আইডির সাথে যুক্ত করা হয়, আমাদের প্রয়োজন:
start transaction;
insert into the_entity (id) values (3);
insert into the_relation (the_entity_id, uniqnull) values (3, 5);
commit;
এবং, যদি # ইন্টিটিটির জন্য 10 এর আইডি মানটির কোনও স্বতন্ত্র অংশ না থাকে তবে আমরা কেবল এটিই করি:
start transaction;
insert into the_entity (id) values (10);
commit;
এই তথ্যটিকে অস্বীকৃতি জানাতে এবং ডাটা_তন্ত্রের মতো একটি সারণী যে তথ্যটি ধরে রাখবে তা পেতে, আমাদের এগুলি করতে হবে:
select
id, uniqnull
from
the_entity left outer join the_relation
on
the_entity.id = the_relation.the_entity_id
;
"বাম বাহিরের জোড়" অপারেটর নিশ্চিত করে যে_আরটিটি থেকে সমস্ত সারি ফলাফলের মধ্যে উপস্থিত হবে, যখন এনআরএলকে এককনুল কলামে রাখবে যখন কোনও মিল নেই কলামগুলি_আরলেশনে উপস্থিত না থাকে।
মনে রাখবেন, একটি ভাল নরমালাইজড ডাটাবেস ডিজাইনে কিছু দিন (বা সপ্তাহ বা মাস) ব্যয় করা যে কোনও প্রচেষ্টা (এবং সম্পর্কিত নীতি নির্ধারণী দৃষ্টিভঙ্গি এবং পদ্ধতিগুলি) আপনাকে বছরের (বা দশক) বেদনা এবং অপচয় করা সংস্থান সাশ্রয় করবে।