2010-06-29 4 views
5

मैं एक खुला स्रोत PHP पर काम कर रहा हूँ/MySQL आवेदनक्या PHP/MySQL ऐप्स के लिए विदेशी कुंजी घोषित करने के लिए यह एक आम प्रथा है?

मैं phpBB, Wordpress, और अन्य एप्लिकेशन पर ध्यान दिया है देखने के लिए अगर वे विदेशी कुंजी या निर्दिष्ट नहीं किया (रेफेरेंन्शिअल सत्यनिष्ठा सुनिश्चित करने के लिए)

मैं नहीं मिल सकता है कि उनके पास

क्या यह इस प्रकार के अनुप्रयोगों में MySQL डेटाबेस संरचना में विदेशी कुंजी निर्दिष्ट करने के लिए एक सामान्य प्रथा है?

उत्तर

4

पिछले संस्करणों: Referential Integrety उनके रोडमैप के अनुसार 6.1 में एक "नई सुविधा" हो जाएगा डिफ़ॉल्ट रूप से MyISAM स्टोरेज इंजन, जो विदेशी कुंजी बाधाओं का समर्थन नहीं करता है। जब तक आप इनो डीबी स्टोरेज इंजन का उपयोग करने के लिए स्पष्ट रूप से टेबल घोषित नहीं करते हैं, या डिफ़ॉल्ट स्टोरेज इंजन सर्वर-व्यापी को बदलते हैं, कोई विदेशी कुंजी दिखाई नहीं देती है, और इसमें कोई आश्चर्य की बात नहीं है कि माइक्रोसॉफ्ट के लिए डिज़ाइन किए गए सॉफ़्टवेयर डेवलपर्स विदेशी कुंजी बाधाओं का उपयोग करने के लिए परेशान नहीं हैं।

MySQL 5.5 वर्तमान में बीटा में है और अंत में InnoDB डिफ़ॉल्ट स्टोरेज इंजन होगा। तो बॉक्स के बाहर विदेशी कुंजी बाधाओं का समर्थन किया जाएगा।

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


पुन टिप्पणी प्रपत्र @Jacob: अच्छा अंक है, लेकिन हाल लेख InnoDB बनाम MyISAM साल पहले की तुलना अवश्य पढ़ लें, MyISAM "तेजी से भंडारण इंजन" माना जाता था और InnoDB स्तोरागे engine आप माना जाता था अगर आप लेनदेन के बिना नहीं कर सकते हैं तो अनिच्छा से उपयोग करना होगा।

लेकिन पिछले कुछ वर्षों में इनो डीबी ने नाटकीय रूप से सुधार किया है, और ज्यादातर मामलों में आज InnoDB तेजी से MyISAM से करता है।

माईसाम के अलावा अभी भी फुलटेक्स्ट इंडेक्सिंग का समर्थन करते हुए, माइस्सम का उपयोग करने के कम और कम कारण हैं। जब मुझे फुलटेक्स्ट इंडेक्सिंग की आवश्यकता होती है, तो मैं या तो आईओएसडीबी में अपने प्राथमिक स्टोरेज के दर्पण के रूप में एक माईसाम टेबल बनाए रखता हूं, अन्यथा मैं Apache Solr का उपयोग करता हूं।

+0

धन्यवाद, यह – samJL

+0

+1 समझ में आता है - सुनिश्चित करें कि आप MyISAM पर innoDB का उपयोग करने के डाउनसाइड्स को समझते हैं। InnoDB बनाम MyISAM के लिए Google खोज करें, दोनों के फायदे और नुकसान पर चर्चा करने वाले कई लेख हैं। तो यह वास्तव में इस बात पर निर्भर करता है कि आप डीबी का उपयोग कर रहे हैं कि क्या आप वास्तव में चाहते हैं कि मायिसैम लाए गए कुछ फायदों पर आप वास्तव में वांछित अखंडता चाहते हैं। एक जिसे मैंने पिछले हफ्ते अभी खोजा था वह यह है कि innoDB पूर्ण-पाठ खोजों (अभी तक) का समर्थन नहीं करता है, लेकिन माईसाम करता है :( – Jacob

+0

जब इंनोडीबी बनाम मायिसैम की बात आती है तो अंगूठे का मेरा नियम है; यदि आपको पूर्ण पाठ खोज करने की आवश्यकता है , माईसाम का उपयोग करें। पूर्ण पाठ खोज एकमात्र चीज प्रतीत होती है जो गति के संदर्भ में इनोसडीबी पर मायिसम का बड़ा फायदा है –

0

MySQL विदेशी कुंजी का सम्मान नहीं करता था। यह तब तक नहीं करता जब तक कि आप उपाय नहीं करते।

दृष्टि से बाहर, दिमाग से, सही?

1

मुझे यकीन नहीं है कि यह कितना आम है, लेकिन मुझे लगता है कि आपको ऑब्जेक्ट मॉडल की शर्तों को पूरी तरह से व्यक्त करना चाहिए चाहे अंतर्निहित डेटाबेस पूरी तरह से उनका समर्थन करता हो।

यदि आप आम तौर पर एएनएसआई एसक्यूएल लिख रहे हैं, तो यदि आप आगे बढ़ते हैं और विदेशी कुंजी बाधाओं को जोड़ते हैं, तो जब आपका डेटाबेस उनका समर्थन करता है, तो आप उनका समर्थन करने वाले इंजन का उपयोग करते हैं, या आप उन्हें समर्थन देने वाले दूसरे डेटाबेस पर जाते हैं, तो आप उन्हें "मुक्त" के लिए प्राप्त करेंगे और वापस जाने और सभी संबंधों को खोजने का प्रयास नहीं करेंगे।

तो, मैं विदेशी कुंजी को एसक्यूएल में रखूंगा, लेकिन यह मुझे और फिर सामान्य नहीं हो सकता है।

+0

नहीं, यह भी मैं हूं। जब तक मैं एक SO सवाल के लिए एक फेंक स्कीमा लिख ​​रहा हूँ। –

+0

धन्यवाद एक अच्छी प्रैक्टिस की तरह लगता है – samJL

0

MySQL में केवल InnoDB विदेशी कुंजी का समर्थन करता है, और केवल MySQL 5.1 के बाद।

संपादित करें: InnoDB MySQL में डिफ़ॉल्ट संग्रहण इंजन होगा 5.5

संपादित-ध्यान न दें: MySQL उपयोग की http://en.wikipedia.org/wiki/MySQL#Future_releases

+0

वह विकी जानकारी वास्तव में पुरानी है। MySQL 6 को ढंका हुआ है, और MySQL 5.5 डिफ़ॉल्ट स्टोरेज इंजन के रूप में InnoDB का समर्थन करेगा। –

+0

@ बिल करविन, PHP 6 स्क्रैप किया गया, MySQL 6 स्क्रैप किया गया, उन 6 के साथ कुछ है। –

+1

मैंने आपके द्वारा लिंक किए गए विकिपीडिया पैराग्राफ को संपादित किया है। –

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

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