Zdá se, že vás zajímá:
-- 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
Pokud chcete dotazy abyste nebyli zatíženi, stačí definovat Foo. Můžete se ho zeptat na vzácné.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Jakýkoli jiný návrh trpí složitostí aktualizací při udržování konzistentnosti databáze.
Máte nějaké nejasné obavy z toho, že Rare je mnohem menší než Foo. Jaký je ale váš požadavek je jen n z milionu Foo záznamů je mnoho:mnoho, podle kterých byste si vybrali nějaký jiný design?
Další úrovní složitosti je mít Foo a Rare. Aktualizace musí zachovat výše uvedenou rovnici pravdivou.
Zdá se krajně nepravděpodobné, že by bylo přínosné snížit redundanci 2 nebo 3 z milionu Foo + Rare tím, že budete mít pouze Boring + Rare a rekonstruujete z nich Foo. Ale může být užitečné definovat jedinečný index (b) pro Boring, který bude tvrdit, že ab v něm má pouze jedno a. Když potřebujete Foo:
Foo = select * from Boring union select * from Rare
Ale vaše aktualizace to musí zachovat
not exists (select * from Boring b join Rare r where b.b = r.b)