Kesin olarak konuşursak, benzersiz bir boş değer atanabilir sütun (veya sütun kümesi) yalnızca bir kez NULL (veya bir NULL kaydı) olabilir, çünkü aynı değere (ve bu NULL içerir) birden fazla kez benzersiz kısıtlamayı açıkça ihlal eder.
Ancak bu, "benzersiz boş değer atanabilir sütunlar" kavramının geçerli olduğu anlamına gelmez; bunu herhangi bir ilişkisel veritabanında gerçekten uygulamak için, bu tür veritabanlarının düzgün çalışması için normalleştirilmesi gerektiğini ve normalizasyonun genellikle varlıklar arasında ilişkiler kurmak için birkaç (varlık olmayan) ekstra tablonun eklenmesini içerdiğini unutmamalıyız. .
Yalnızca bir "benzersiz boş değer atanabilir sütun" göz önünde bulundurularak temel bir örnek üzerinde çalışalım, onu bu tür daha fazla sütuna genişletmek kolaydır.
Şöyle bir tabloyla temsil edilen bilgileri varsayalım:
create table the_entity_incorrect
(
id integer,
uniqnull integer null, /* we want this to be "unique and nullable" */
primary key (id)
);
Bunu uniqnull'u ayırarak ve uniqnull değerleri ile the_entity arasında bir ilişki kurmak için ikinci bir tablo ekleyerek yapabiliriz (uniqnull "the_entity" içinde "yerine):
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)
);
Bir uniqnull değerini bir satırla ilişkilendirmek için, ilişkiye bir satır da eklememiz gerekir.
Özgünlükteki satırlar için hiçbir benzersiz değer ilişkilendirilmedi (yani, özdeşlik_ yanlışına NULL koyacağımız olanlar için) ilişkiye bir satır eklemiyoruz.
Uniqnull için değerlerin tüm the_relation için benzersiz olacağına dikkat edin ve ayrıca, the_entity'deki her bir değer için, üzerindeki birincil ve yabancı anahtarlar bunu zorladığından, the_relation'da en fazla bir değer olabileceğine dikkat edin.
Daha sonra, uniqnull için 5 değeri, 3 olan bir the_entity id ile ilişkilendirilecekse, şunları yapmamız gerekir:
start transaction;
insert into the_entity (id) values (3);
insert into the_relation (the_entity_id, uniqnull) values (3, 5);
commit;
Ve, eğer the_entity için 10'luk bir id değerinin benzersiz karşılığı yoksa, yalnızca şunları yaparız:
start transaction;
insert into the_entity (id) values (10);
commit;
Bu bilgiyi normalden arındırmak ve verileri_entity_incorrect gibi bir tablonun tutacağı verileri elde etmek için yapmamız gerekenler:
select
id, uniqnull
from
the_entity left outer join the_relation
on
the_entity.id = the_relation.the_entity_id
;
"Sol dış birleştirme" operatörü, the_entity'deki tüm satırların sonuçta görünmesini sağlar ve ilişkide eşleşen sütun bulunmadığında uniqnull sütununa NULL koyar.
İyi normalleştirilmiş bir veritabanı (ve buna karşılık gelen normalleştirici görünümler ve prosedürler) tasarlamak için bazı günler (veya haftalar veya aylar) için harcanan herhangi bir çaba, sizi yıllarca (veya on yıllarca) acıdan ve boşa harcanan kaynaklardan kurtaracaktır.