Изглежда, че се интересувате от:
-- 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
Ако искате заявки за да бъдете необременени, просто дефинирайте Foo. Можете да го потърсите за редки.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Всеки друг дизайн страда от сложност на актуализирането при поддържане на базата данни последователна.
Имате някаква неясна загриженост, че Rare е много по-малък от Foo. Но какво е вашето изискване дали само n от един милион Foo записи са много:много, според които бихте избрали друг дизайн?
Следващото ниво на сложност е да имате Foo и Rare. Актуализациите трябва да поддържат горното уравнение вярно.
Изглежда изключително малко вероятно да има полза от намаляването на излишъка от 2 или 3 на милион на Foo + Rare, като имате само Boring + Rare и реконструирате Foo от тях. Но може да е от полза да се дефинира уникален индекс (b) за Boring, който ще поддържа, че b в него има само едно a. Когато имате нужда от Foo:
Foo = select * from Boring union select * from Rare
Но вашите актуализации трябва да поддържат това
not exists (select * from Boring b join Rare r where b.b = r.b)