Có vẻ như bạn quan tâm đến:
-- 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
Nếu bạn muốn truy vấn để không bị cản trở, chỉ cần xác định Foo. Bạn có thể truy vấn nó cho Rare.
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
Bất kỳ thiết kế nào khác đều gặp phải sự phức tạp khi cập nhật trong việc giữ cho cơ sở dữ liệu nhất quán.
Bạn có chút lo lắng về việc Rare nhỏ hơn nhiều so với Foo. Nhưng yêu cầu của bạn là gì Chỉ có n trong một triệu bản ghi Foo là rất nhiều:rất nhiều trong số đó bạn sẽ chọn thiết kế nào khác?
Mức độ phức tạp tiếp theo là có Foo và Rare. Cập nhật phải giữ cho phương trình trên đúng.
Có vẻ như rất khó có lợi ích trong việc giảm 2 hoặc 3 trong một triệu dư thừa của Foo + Rare bằng cách chỉ có Boring + Rare và tạo lại Foo từ chúng. Nhưng có thể hữu ích khi xác định một chỉ mục duy nhất (b) cho Boring sẽ duy trì rằng a b trong đó chỉ có một a. Khi bạn cần Foo:
Foo = select * from Boring union select * from Rare
Nhưng các bản cập nhật của bạn phải duy trì điều đó
not exists (select * from Boring b join Rare r where b.b = r.b)