Du verkar vara intresserad av:
-- 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
Om du vill ha frågor för att vara obehindrad, definiera bara Foo. Du kan fråga efter Rare.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
All annan design lider av uppdateringskomplexitet för att hålla databasen konsekvent.
Du har en suddig oro över att Rare är mycket mindre än Foo. Men vad är ditt krav finns det bara n i en miljon Foo-skivor som är många:många med vilka du skulle välja någon annan design?
Nästa nivå av komplexitet är att ha Foo och Rare. Uppdateringar måste hålla ovanstående ekvation sann.
Det verkar extremt osannolikt att det finns en fördel med att minska 2-eller-3-på-en-miljon-redundansen för Foo + Rare genom att bara ha Boring + Rare och rekonstruera Foo från dem. Men det kan vara fördelaktigt att definiera ett unikt index (b) för Boring som kommer att hävda att ett b i det bara har ett a. När du behöver Foo:
Foo = select * from Boring union select * from Rare
Men dina uppdateringar måste behålla det
not exists (select * from Boring b join Rare r where b.b = r.b)