Anda tampaknya tertarik pada:
-- a and b are related by the association of interest
Foo(a, b)
-- foo(a, b) but not foo(a2, b) for some a2 <> a
Boring(a, b)
unique(b)
FK (a, b) references Foo
-- foo(a, b) and foo(a2, b) for some a2 <> a
Rare(a, b)
FK (a, b) references foo
Jika Anda ingin permintaan untuk tidak terbebani, cukup tentukan Foo. Anda dapat menanyakannya untuk Rare.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Setiap desain lain menderita kompleksitas pembaruan dalam menjaga database tetap konsisten.
Anda memiliki beberapa kekhawatiran kabur tentang Rare yang jauh lebih kecil dari Foo. Tapi apa persyaratan Anda? hanya ada n dalam sejuta catatan Foo yang banyak:banyak di mana Anda akan memilih beberapa desain lain?
Tingkat kerumitan selanjutnya adalah memiliki Foo dan Rare. Pembaruan harus menjaga persamaan di atas tetap benar.
Tampaknya sangat tidak mungkin bahwa ada manfaat dalam mengurangi redundansi 2-atau-3-dalam-sejuta Foo + Rare dengan hanya memiliki Boring + Rare dan merekonstruksi Foo dari mereka. Tetapi mungkin bermanfaat untuk mendefinisikan indeks unik (b) untuk Boring yang akan mempertahankan bahwa a b di dalamnya hanya memiliki satu a. Saat Anda membutuhkan Foo:
Foo = select * from Boring union select * from Rare
Tetapi pembaruan Anda harus mempertahankannya
not exists (select * from Boring b join Rare r where b.b = r.b)