ऐसा लगता है कि आपकी इसमें रुचि है:
-- 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
अगर आप प्रश्न चाहते हैं भारमुक्त होने के लिए, बस फू को परिभाषित करें। आप इसे दुर्लभ के लिए क्वेरी कर सकते हैं।
Rare = select * from Foo f join Foo f2
where f.a <> f2.a and f.b = f2.b
कोई अन्य डिज़ाइन डेटाबेस को सुसंगत रखने में अद्यतन जटिलता से ग्रस्त है।
रेयर के फू से बहुत छोटे होने के बारे में आपको कुछ अस्पष्ट चिंता है। लेकिन आपकी आवश्यकता क्या है? लाखों फू रिकॉर्ड्स में से केवल n ही कई हैं:कई जिनके द्वारा आप कोई अन्य डिज़ाइन चुनेंगे?
जटिलता का अगला स्तर फू और रेयर होना है। अपडेट को उपरोक्त समीकरण को सही रखना होगा।
ऐसा बहुत कम लगता है कि केवल बोरिंग + रेयर होने और उनसे फू को फिर से बनाने से फू + रेयर की 2-या-3-इन-ए-मिलियन रिडंडेंसी को कम करने में कोई लाभ होता है। लेकिन बोरिंग के लिए एक अद्वितीय इंडेक्स (बी) को परिभाषित करना फायदेमंद हो सकता है जो यह बनाए रखेगा कि इसमें बी में केवल एक ए है। जब आपको फू की आवश्यकता हो:
Foo = select * from Boring union select * from Rare
लेकिन आपके अपडेट को इसे बनाए रखना चाहिए
not exists (select * from Boring b join Rare r where b.b = r.b)