Sebenarnya, kolom unik nullable (atau kumpulan kolom) dapat berupa NULL (atau catatan NULL) hanya sekali, karena memiliki nilai yang sama (dan ini termasuk NULL) lebih dari sekali jelas melanggar batasan unik.
Namun, itu tidak berarti konsep "kolom nullable unik" valid; untuk benar-benar menerapkannya dalam database relasional apa pun, kita hanya perlu mengingat bahwa jenis database ini dimaksudkan untuk dinormalisasi agar berfungsi dengan baik, dan normalisasi biasanya melibatkan penambahan beberapa tabel tambahan (non-entitas) untuk membangun hubungan antara entitas. .
Mari bekerja contoh dasar dengan mempertimbangkan hanya satu "kolom nullable unik", mudah untuk memperluasnya ke lebih banyak kolom seperti itu.
Misalkan kita informasi direpresentasikan oleh tabel seperti ini:
create table the_entity_incorrect
(
id integer,
uniqnull integer null, /* we want this to be "unique and nullable" */
primary key (id)
);
Kita dapat melakukannya dengan memisahkan uniqnull dan menambahkan tabel kedua untuk membuat hubungan antara nilai uniqnull dan the_entity (daripada memiliki uniqnull "di dalam" 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)
);
Untuk mengaitkan nilai uniqnull ke baris di the_entity kita juga perlu menambahkan baris di the_relation.
Untuk baris di the_entity tidak ada nilai uniqnull yang diasosiasikan (yaitu untuk baris yang akan kita masukkan NULL di the_entity_incorrect) kita tidak menambahkan baris di the_relation.
Perhatikan bahwa nilai uniqnull akan unik untuk semua the_relation, dan juga perhatikan bahwa untuk setiap nilai dalam the_entity paling banyak dapat ada satu nilai dalam the_relation, karena kunci utama dan asing di atasnya memberlakukan ini.
Kemudian, jika nilai 5 untuk uniqnull akan dikaitkan dengan id the_entity dari 3, kita perlu:
start transaction;
insert into the_entity (id) values (3);
insert into the_relation (the_entity_id, uniqnull) values (3, 5);
commit;
Dan, jika nilai id 10 untuk the_entity tidak memiliki pasangan uniqnull, kita hanya melakukan:
start transaction;
insert into the_entity (id) values (10);
commit;
Untuk mendenormalisasi informasi ini dan mendapatkan data tabel seperti the_entity_incorrect, kita perlu:
select
id, uniqnull
from
the_entity left outer join the_relation
on
the_entity.id = the_relation.the_entity_id
;
Operator "left outer join" memastikan semua baris dari the_entity akan muncul dalam hasil, meletakkan NULL di kolom uniqnull saat tidak ada kolom yang cocok di the_relation.
Ingat, setiap upaya yang dilakukan selama beberapa hari (atau minggu atau bulan) dalam mendesain database yang dinormalisasi dengan baik (dan tampilan dan prosedur denormalisasi yang sesuai) akan menghemat waktu bertahun-tahun (atau dekade) dari rasa sakit dan sumber daya yang terbuang percuma.