Wygląda na to, że interesuje Cię:
-- 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
Jeśli chcesz zapytania być nieobciążonym, po prostu zdefiniuj Foo. Możesz zapytać o to dla Rare.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Każdy inny projekt cierpi z powodu złożoności aktualizacji w utrzymaniu spójności bazy danych.
Masz niejasne obawy, że Rare jest znacznie mniejszy niż Foo. Ale jakie są Twoje wymagania Czy jest tylko n na milion rekordów Foo, których jest wiele:wiele, dzięki którym wybrałbyś inny projekt?
Kolejnym poziomem złożoności jest posiadanie Foo i Rare. Aktualizacje muszą zachować prawdziwość powyższego równania.
Wydaje się bardzo nieprawdopodobne, że istnieje korzyść w zmniejszeniu redundancji 2 lub 3 na milion w Foo + Rare poprzez posiadanie tylko Boring + Rare i rekonstrukcję Foo z nich. Ale może być korzystne zdefiniowanie unikalnego indeksu (b) dla Boringa, który utrzyma, że a b w nim ma tylko jedno a. Kiedy potrzebujesz Foo:
Foo = select * from Boring union select * from Rare
Ale twoje aktualizacje muszą to utrzymać
not exists (select * from Boring b join Rare r where b.b = r.b)