Je lijkt geïnteresseerd in:
-- 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
Als u vragen wilt om onbelast te zijn, definieer gewoon Foo. Je kunt het opvragen voor Zeldzaam.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Elk ander ontwerp lijdt aan de complexiteit van updates om de database consistent te houden.
Je hebt een vaag vermoeden dat Rare veel kleiner is dan Foo. Maar wat is uw vereiste zijn er maar n op een miljoen Foo-records, veel:veel waarmee je een ander ontwerp zou kiezen?
Het volgende niveau van complexiteit is om Foo en Rare te hebben. Updates moeten de bovenstaande vergelijking waar houden.
Het lijkt uiterst onwaarschijnlijk dat er een voordeel is bij het verminderen van de 2- of-3-in-a-miljoen redundantie van Foo + Rare door alleen Boring + Rare te gebruiken en Foo daaruit te reconstrueren. Maar het kan nuttig zijn om een unieke index (b) voor Boring te definiëren die volhoudt dat a b daarin slechts één a heeft. Wanneer je Foo nodig hebt:
Foo = select * from Boring union select * from Rare
Maar uw updates moeten dat behouden
not exists (select * from Boring b join Rare r where b.b = r.b)