2012-02-19 16 views
9

मैं एक ऐसी प्रणाली का निर्माण कर रहा हूं जो कई अन्य प्रणालियों से डेटा संग्रहित करने के लिए केंद्रीय भंडार है। जब अन्य सिस्टम डेटा अपडेट किया जाता है तो केंद्रीय भंडार को अद्यतन करने के लिए एक सिंक प्रक्रिया की आवश्यकता होती है। केंद्रीय रेपो को किस सिस्टम को सिंक करने की आवश्यकता है और सिंक प्रकार की आवश्यकता है, यह पहचानने के लिए एक सिंक_एक्शन तालिका होगी। परिभाषित कार्यों का सेट है जो बदलने की संभावना नहीं है। एक पतला डाउन सिस्टम नीचे है।अखंडता के लिए विदेशी कुंजी बनाम चेक बाधा

मैं इसे देखना जैसा कि मैंने इसे दो तरीकों से संपर्क कर सकते हैं:

विकल्प 1) एक Action तालिका 3 कार्यों उपलब्ध है है। sync_action तालिका है जो आवश्यक कार्यों के संदर्भ में एक विदेशी कुंजी का उपयोग करती है।

तालिका: सिस्टम

ID Description 
1 Slave System 1 
2 Slave System 2 

तालिका: कार्रवाई

ID Description 
1 Insert 
2 Update 
3 Delete 

तालिका: Sync_action

ID Action System 
1  1  1 
2  2  1 

विकल्प 2) एक विदेशी कुंजी के बजाय sync_action.action कॉलम पर चेक बाधा का उपयोग करें ताकि केवल Insert/Update/Delete क्रियाएं डाली जा सकें।

तालिका: Sync_action

ID Action System 
1 Insert 1 
2 Update 1 

मुझे पता है कि क्या कारकों का निर्धारण जब ईमानदारी की कमी, विदेशी कुंजी बनाम जांच बाधा के बीच तय जो एक बेहतर तरीका है में जाने चाहते हैं। समान धागे रहे हैं लेकिन मुझे उन्हें पर्याप्त निश्चित नहीं मिला। ऐसा इसलिए हो सकता है क्योंकि इसकी व्याख्या के लिए लेकिन किसी भी विचार की सराहना की जाएगी।

यह आम तौर पर एक (कम या ज्यादा स्थिर) संदर्भ तालिका करने के लिए एक FOREIGN KEY बाधा बेहतर है:

चीयर्स

+3

मैं आम तौर पर एफके और टेबल-रिलेशनशिप पसंद करता हूं क्योंकि: वे "अधिक दृश्यमान" (उदाहरण के संबंध में आरेखों में दिखाए जाते हैं) और वे "अधिक विस्तारित" हैं (डेटा पर निर्भर नहीं, न कि हालत, और "अतिरिक्त" जानकारी संलग्न हो सकती है) और वे अक्सर "अधिक मैपेबल" होते हैं (जो भी ओआरएम आप चुनते हैं)। इस तरह के मामलों में मैं * गैर-सरोगेट पीके का उपयोग करने पर विचार करता हूं (यह वास्तव में एक "स्थिर डेटा" तालिका है), शायद "आई", "यू", "डी" जैसे "एक सार्थक चरित्र"। यदि किसी अन्य तालिका में तो "स्वयं दस्तावेज़" लेबल कॉलम भी हो सकते हैं। –

+0

स्टैक ओवरव्लो में आपका स्वागत है: यदि आप कोड, एक्सएमएल या डेटा नमूने पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड नमूने" बटन ('{}') पर क्लिक करें, अच्छी तरह से प्रारूपित करें और वाक्यविन्यास इसे हाइलाइट करें! –

+2

मैं 'pst' से सहमत हूं - क्या होगा यदि आपको चौथी, पांचवीं कार्रवाई जोड़ने की आवश्यकता है ?? यदि आपके पास एक अलग 'एक्शन' तालिका है, तो यह पंक्ति जोड़ने के समान सरल है। यदि आपके पास चेक बाधाएं हैं, तो आपको ड्रॉप छोड़ने और उनको फिर से बनाने की आवश्यकता है - यह अधिक काम है, और अधिक परेशानी है। मुझे ** कोई अलग तर्क नहीं दिख रहा है ** ** एक अलग 'एक्शन' तालिका है और एफके बाधा का उपयोग कर रेफरेंसियल अखंडता लागू करना - डेटाबेस उस पर अच्छा है! (यह उनका मुख्य व्यवसाय है!) –

उत्तर

6

टिप्पणीकारों umanimously सहमत लगता है। कारण:

  • बाधा आसानी से "विस्तार योग्य" है। किसी विकल्प को जोड़ने या निकालने के लिए, आपको केवल refernce तालिका से पंक्ति जोड़ने या निकालना होगा। आपको बाधा छोड़ना और इसे फिर से बनाना नहीं है। और भी, यदि आपके पास अन्य तालिकाओं में समान स्तंभों में भी समान बाधा है।

  • आपके पास अतिरिक्त जानकारी संलग्न हो सकती है (अधिक कॉलम), यदि आवश्यक हो तो एप्लिकेशन द्वारा पढ़ा जा सकता है।

  • ओआरएम इन बाधाओं के बारे में बेहतर (पढ़ें: जागरूक) के साथ सौदा कर सकते हैं। उन्हें सिर्फ एक टेबल पढ़ना है, मेटा-डेटा नहीं।

  • यदि आप एक्शन कोड बदलना चाहते हैं, तो कैस्केडिंग प्रभाव अन्य (संभवतः कई) तालिकाओं में बदलावों का ख्याल रखेगा। अद्यतन प्रश्न लिखने की कोई ज़रूरत नहीं है।

  • एक विशेष डीबीएमएस ने अभी तक CHECK बाधाओं (शर्म की बात) लागू नहीं की है, हालांकि इसमें एफके हैं।

रूप @pst उल्लेख किया है (और मैं बहुत ज्यादा इस दृष्टिकोण पसंद करते हैं), तो आप एक समझदार कोड के बजाय एक किराए पूर्णांक आईडी का उपयोग कर सकते हैं। तो, अपनी मेज हो सकता है:

तालिका: सिस्टम

SystemID Description 
1  Slave System 1 
2  Slave System 2 

तालिका: कार्रवाई

ActionCode Description 
I   Insert 
U   Update 
D   Delete 

तालिका: SyncAction

ID ActionCode SystemID 
1  I   1 
2  U   1 
+0

हमने इस तरह की एक प्रणाली को मेरे वर्तमान कार्यस्थल पर विकसित किया है, और यह काफी अच्छी तरह से काम करता है। प्राथमिक कुंजी का प्रकार इंगित करता है कि तालिका "संदर्भ डेटा" है (गैर-पूर्णांक पीके, तकनीक द्वारा मैन्युअल रूप से अपडेट किया गया) या सामान्य डेटा (पूर्णांक सरोगेट पीके, अनुप्रयोगों द्वारा प्रबंधित किया जा सकता है)। – araqnid

3

मुझे लगता है कि आप विदेशी कुंजी बाधा और चेक बाधा के बीच अंतर को भ्रमित कर रहे हैं।

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

यदि हम कॉलम user_id, user_name, address_id, join_date, active, last_active_month के साथ तालिका users पर विचार करते हैं; मैं मानता हूं कि यह चीजों को करने का सबसे अच्छा तरीका नहीं है, लेकिन यह उस बिंदु के लिए काम करेगा जो मैं बनाने की कोशिश कर रहा हूं।

इस मामले में यह address_id को बाधा के रूप में पेटी से हास्यास्पद है। इस कॉलम में कई मूल्य हो सकते हैं। हालांकि, active, मानते हैं कि हम एक बूलियन y/n चाहते हैं केवल दो संभावित मान हो सकते हैं और last_active_month में केवल 12 संभावित मान हो सकते हैं। इन दोनों मामलों में एक विदेशी कुंजी होने के लिए यह पूरी तरह हास्यास्पद है। केवल कुछ निश्चित मूल्य हैं और आपके द्वारा समेकित डेटा की परिभाषा द्वारा परिवर्तन नहीं हो सकता है।

आपके मामले में, आप एक जांच बाधा के लिए जा सकते हैं, जबकि जब तक आप बात को पूरी तरह कि actions की संख्या कभी नहीं बदलेगा एक विदेशी कुंजी जाना सही तरीका है हो सकता है।


थोड़ा अलग मामले पर, और @pst के रूप में, मुझे लगता है कि आप सरोगेट कुंजी राक्षस द्वारा खाया गया है। जबकि यह आपके द्वारा अनुमानित आकार की एक तालिका में प्रदर्शन सुधारों में परिणाम दे सकता है (3 मान, insert/update/delete) या यहां तक ​​कि एक बड़ा यह भी करने के लिए काम करता है जो आप प्राप्त करने की कोशिश कर रहे हैं।

यह

ID Action System 
1  1  1 
2  2  1 

देख कर आपको क्या हो रहा है करने के लिए आसान नहीं है, लेकिन:

ID Action System 
1 insert  1 
2 update  1 

दूर पढ़ने में आसान है; आप system कॉलम के लिए भी ऐसा करने पर विचार करना चाह सकते हैं - शायद मैं चाहता हूं, हालांकि संभव मूल्यों की संख्या इस में थोड़ा सा कूदती है। इस मामले पर बस मेरे व्यक्तिगत विचार ...

संबंधित मुद्दे