5

इस तरह की एक स्कीमा की कल्पना करें।तालिका में विदेशी कुंजी शॉर्टकट

NOTE TABLE:   NoteID, Note, DetailedTaskID, ..... 

DETAILED TASK TABLE: DetailedTaskID, WorkOrderID, ..... 

WORKORDER TABLE:  WorkOrderID, ProjectID, ..... 

PROJECT TABLE:   ProjectID, ..... 

अब इस स्कीमा के साथ देता है कहते हैं कि मैं सभी नोट है कि एक विशेष परियोजना मैं काफी मिलती है की संख्या के साथ अंत करने के लिए जुड़े हुए हैं प्राप्त करना चाहते हैं।

IE: Note JOIN DetailedTask JOIN WorkOrder JOIN Project 

तो मेरे सवाल यह है, जब (यदि कभी) यह एक मेज के लिए एक "शॉर्टकट" स्तंभ जोड़ने के लिए (इस मामले ProjectID में) उचित है?

तो मूल रूप से यह करने के लिए टिप्पणी तालिका बदल रहा है: NoteID, नोट, DetailedTaskID, ProjectID

उत्तर

7

संक्षिप्त उत्तर: कभी, कभी, कभी नहीं।

लंबे समय तक जवाब: केवल जब:

  1. आप निर्धारित किया है कि मिलती है के प्रदर्शन अस्वीकार्य है (जो शायद ही कभी सच है)।

  2. आपने वास्तव में सभी कम खतरनाक विकल्पों को समाप्त कर दिया है।

  3. आप अतिरिक्त काम सिंक में अनावश्यक, de-सामान्यीकृत जानकारी रखने में शामिल अवशोषित करने के लिए तैयार हैं

  4. आप तथ्य यह है कि यह तो तकनीकी रूप से संभव हो जाता है अपने डेटाबेस गलत परिणाम वापस जाने के लिए के लिए स्वीकार करने को तैयार हैं यदि आप कभी चीजों को सिंक करने में असफल रहते हैं।

+0

क्या मैं अभी पुष्टि कर सकता हूं? जब आप "कम खतरनाक" कहते हैं, तो मुझे लगता है कि आप एक परिदृश्य का मतलब है जहां एक बग एक विदेशी कुंजी को एक परियोजना को इंगित करने का कारण बन सकता है और एक दूसरे को इंगित कर सकता है, है ना? –

+0

बस इतना। इस मामले में आपके कोड में एक निरीक्षण (या किसी और का कोड, बाद में जोड़ा गया) विदेशी तालिका को एक तालिका में अपडेट कर सकता है, न कि दूसरे। या, यह दूसरी तालिका में पंक्तियों में केवल कुछ डी-सामान्यीकृत विदेशी कुंजी मानों को अपडेट कर सकता है, लेकिन दूसरों को नहीं। या यह दूसरी तालिका में बहुत सारी पंक्तियों को अपडेट कर सकता है। और आप इन त्रुटियों को तुरंत, या लगातार नहीं देख सकते हैं, यदि कभी-कभी आप सामान्यीकृत तालिका से विदेशी कुंजी मान प्राप्त कर रहे हैं और कभी-कभी denormalized तालिका से प्राप्त कर रहे हैं। यह किया जा सकता है, लेकिन सुनिश्चित करें कि आपको पहले इसे करने की वास्तविक आवश्यकता है। –

+0

आपके इनपुट के लिए बहुत बहुत धन्यवाद ... –

1

आपके बारे में क्या एक विदेशी कुंजी रिश्ता कहा जाता है बात कर रहे हैं। यह Data Normalization का आधार है। संक्षेप में, यदि आप नोट (यानी नोटआईडी) किसी प्रोजेक्ट से संबंधित हैं तो आप अपनी नोट टेबल पर एक विदेशी कुंजी रिलेशनशिप (प्रोजेक्टआईडी) जोड़ देंगे।

ऐसा करने का लाभ यह है कि आप इस तरह इस संबंधपरक डेटा क्वेरी कर सकता है, इसलिए कर रहे हैं:

select 
    Note.*, 
    Project.* 
from Note 
left join Project 
on Note.ProjectId = Project.ProjectId 

कि क्वेरी सभी नोट, और परियोजना डेटा प्राप्त होते हैं (अगर यह एक परियोजना का हिस्सा है) है कि इससे संबंधित