Du ser ud til at være interesseret i:
-- 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
Hvis du ønsker forespørgsler for at være ubehæftet, skal du bare definere Foo. Du kan forespørge efter Rare.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Ethvert andet design lider under opdateringskompleksitet ved at holde databasen konsistent.
Du har en uklar bekymring over, at Rare er meget mindre end Foo. Men hvad er dit krav er der kun n i en million Foo-optegnelser, der er mange:mange, som du ville vælge et andet design med?
Det næste niveau af kompleksitet er at have Foo og Rare. Opdateringer skal holde ovenstående ligning sand.
Det virker ekstremt usandsynligt, at der er en fordel ved at reducere 2-eller-3-i-en-million-redundansen af Foo + Rare ved kun at have Boring + Rare og rekonstruere Foo fra dem. Men det kan være en fordel at definere et unikt indeks (b) for Boring, som vil fastholde, at et b i sig kun har et a. Når du har brug for Foo:
Foo = select * from Boring union select * from Rare
Men dine opdateringer skal fastholde det
not exists (select * from Boring b join Rare r where b.b = r.b)