Sie scheinen interessiert zu sein an:
-- 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
Wenn Sie Abfragen wünschen Um unbelastet zu sein, definieren Sie einfach Foo. Sie können es nach Selten abfragen.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Jedes andere Design leidet unter der Aktualisierungskomplexität, um die Datenbank konsistent zu halten.
Sie haben einige unscharfe Bedenken, dass Rare viel kleiner als Foo ist. Aber was ist Ihre Anforderung Sind nur n von einer Million Foo-Aufzeichnungen viele:viele, bei denen Sie ein anderes Design wählen würden?
Die nächste Komplexitätsstufe ist Foo und Rare. Updates müssen die obige Gleichung wahr halten.
Es scheint äußerst unwahrscheinlich, dass es einen Vorteil bringt, die 2-oder-3-in-einer-Million-Redundanz von Foo + Rare zu reduzieren, indem man nur Boring + Rare hat und Foo daraus rekonstruiert. Es kann jedoch von Vorteil sein, einen eindeutigen Index (b) für Boring zu definieren, der besagt, dass ein b nur ein a enthält. Wenn Sie Foo brauchen:
Foo = select * from Boring union select * from Rare
Aber Ihre Updates müssen dies beibehalten
not exists (select * from Boring b join Rare r where b.b = r.b)