あなたは興味があるようです:
-- 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
クエリが必要な場合 邪魔にならないようにするには、Fooを定義するだけです。レアを照会できます。
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
その他の設計では、データベースの一貫性を維持する上で更新が複雑になります。
RareがFooよりもはるかに小さいことについて、あいまいな懸念があります。しかし、あなたの要件は何ですか 100万件のFooレコードのうち、他のデザインを選択するのに必要なものはたくさんありますか?
次のレベルの複雑さは、FooとRareを使用することです。更新では、上記の方程式を真に保つ必要があります。
Boring + Rareを使用し、それらからFooを再構築するだけで、Foo+Rareの100万分の2または3の冗長性を削減するメリットがある可能性は非常に低いようです。ただし、ボーリングの一意のインデックス(b)を定義して、その中のbにaが1つしかないことを維持することは有益な場合があります。 Fooが必要な場合:
Foo = select * from Boring union select * from Rare
ただし、更新ではそれを維持する必要があります
not exists (select * from Boring b join Rare r where b.b = r.b)