मुझे लगता है कि आप दो अलग अलग मुद्दों, जब जब विदेशी उपयोग करने के लिए MyISAM के बजाय InnoDB उपयोग करने के लिए, और के बारे में उलझन में हैं कुंजी (एफके) बाधाएं।
पहले मुद्दे के रूप में, कई जवाब हैं जो MyISAM और InnoDB के बीच अंतर को समझाने का एक अच्छा काम करते हैं। मैं बस दोहरा दूंगा कि, एक लेख से tvanfosson के उद्धरण में, MyISAM ज्यादातर पढ़ने के साथ सिस्टम के लिए बेहतर अनुकूल है। ऐसा इसलिए है क्योंकि यह इनो डीबी जैसे पंक्ति स्तर की बजाय टेबल लेवल लॉकिंग का उपयोग करता है, इसलिए माईसाम उच्च समेकन को भी संभाल नहीं सकता है, साथ ही इसमें अनुपलब्ध विशेषताएं हैं जो डेटा अखंडता जैसे लेन-देन और विदेशी कुंजी (फिर से, पहले से ही दूसरों द्वारा उल्लिखित) के साथ मदद करती हैं।
आपको अपने डेटा मॉडल में एफके बाधाओं का उपयोग करने की आवश्यकता नहीं है। यदि आप जानते हैं कि आपकी तालिकाओं के बीच संबंध क्या हैं, और आपका एप्लिकेशन बग से मुक्त है, तो आप बिना एफके के ठीक से प्राप्त करेंगे। हालांकि, एफके का उपयोग करके आपको डेटाबेस परत पर अतिरिक्त बीमा मिलती है क्योंकि तब MySQL आपके द्वारा बनाए गए बाधाओं के आधार पर आपके एप्लिकेशन को खराब डेटा डालने नहीं देगा।
मामले में आप क्यों इस तरह के उदाहरण के लिए id_order
orders
तालिका के पी का मतलब है कि MySQL आप INSERT
id_order
का एक ही मूल्य नहीं दूँगी के रूप में प्राथमिक कुंजी (पी) का उपयोग करने, किसी स्तंभ बनाने पर स्पष्ट नहीं हैं एक से अधिक बार क्योंकि पीके कॉलम में प्रत्येक पंक्ति अद्वितीय होनी चाहिए।
एक एफके का उपयोग उस तालिका पर किया जाएगा जिस पर दूसरी तालिका पर निर्भरता है, उदाहरण के लिए, order_items
पर orders
(नीचे) पर निर्भरता होगी। id_order_items
order_items
का पीके है और orders
और order_items
के बीच एक से अधिक रिश्तों को स्थापित करने के लिए आप id_order_items
orders
तालिका का एफके बना सकते हैं। इसी तरह, order_items
तालिका में 0Kतालिका में एक पीके हो सकता है ताकि order_items
और items
के बीच एक से अधिक रिश्तों को स्थापित किया जा सके।
** फिर, क्या FK बाधा करता है एक id_item value to the
order_items table that isn't in the
आइटम table, or from adding a
id_order_items to
आदेश that isn't in the
order_items `तालिका जोड़ने से रोक रहा है।
सभी एफके बीमा डेटा अखंडता बीमा करते हैं, और यह आपके टेबल के बीच संबंधों को अन्य डेवलपर्स को भी व्यक्त करने में मदद करता है जो सिस्टम नहीं लिखते हैं (और बाद में महीनों बाद जब आप भूल जाते हैं!), लेकिन मुख्य रूप से यह डेटा अखंडता के लिए है। **
अतिरिक्त क्रेडिट: तो लेनदेन का उपयोग क्यों करें? ठीक है आप पहले से ही एक उद्धरण का उल्लेख करते हैं जो कहता है कि वे बैंकिंग प्रणाली के लिए उपयोगी हैं, लेकिन वे उससे अधिक स्थितियों में उपयोगी हैं।
असल में, एक रिलेशनल डेटाबेस में, विशेष रूप से यदि यह normalized है, तो ऑर्डर जोड़ने, ऑर्डर अपडेट करने या ऑर्डर हटाने जैसे नियमित ऑपरेशन अक्सर 1 से अधिक टेबल को स्पर्श करता है और/या एक से अधिक SQL कथन शामिल होता है। आप एक ही टेबल को कई बार स्पर्श कर सकते हैं (जैसा कि नीचे दिया गया उदाहरण है)। बीटीडब्ल्यू डाटा मैनिपुलेशन लैंग्वेज (डीएमएल) कथन (INSERT
/UPDATE
/DELETE
) केवल एक समय में एक टेबल शामिल है।
एक आदेश जोड़ने का एक उदाहरण:
मैं एक orders
मेज और एक order_items
तालिका सलाह देते हैं। इससे orders
तालिका में id_order
पर पीके हो सकता है, जिसका अर्थ है id_order
orders
में दोहराया नहीं जा सकता है। 1 से कई orders
- order_items
रिलेशनशिप के बिना, आपको orders
तालिका में कई पंक्तियां मिलनी होंगी जिनके साथ कई आइटम थे (आपको इस ई-कॉमर्स सिस्टम बीटीडब्ल्यू के लिए items
तालिका भी चाहिए)। यह उदाहरण एक ऑर्डर जोड़ने जा रहा है और 4 अलग-अलग INSERT
कथन के साथ ऐसा करने में 2 टेबल स्पर्श करें।
(समझाने के उद्देश्य से कोई कुंजी की कमी)
-- insert #1
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)
-- insert #2
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)
-- insert #3
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)
-- insert #4
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)
तो क्या हुआ अगर डालने # 1 और डालने # 2 प्रश्नों को सफलतापूर्वक चलाने के लिए, लेकिन डालने # 3 बयान नहीं किया ? आप एक ऐसे आदेश के साथ समाप्त हो जाएंगे जिसमें एक आइटम गुम हो रहा था, और वह कचरा डेटा होगा। यदि उस स्थिति में, आप सभी प्रश्नों को रोलबैक करना चाहते हैं, तो डेटाबेस उसी स्थिति में है जो से पहले ऑर्डर जोड़ रहा था और फिर शुरू हो गया था, ठीक है कि वास्तव में लेनदेन क्या हैं। ** आप एक साथ प्रश्न पूछते हैं कि आप या तो उन सभी को चाहते हैं, या अपवाद के मामले में, तो लेनदेन में कोई भी नहीं।
तो पी/FK की कमी की तरह, लेन-देन में मदद डेटा अखंडता बीमा **
आपका उदाहरण विदेशी कुंजी कर रहा है, innodb नहीं। आपको पूछा जाना चाहिए कि विदेशी कुंजी क्या हैं। –
क्या "चोट लगाना" है? यह लेख एक अनजान ड्रॉप डाटाबेस से पुनर्प्राप्त करने के बारे में है। –
जिम फेरेंस: मैंने वाक्य को दोबारा प्रस्तुत किया: "यदि आप दृढ़ता से अनुभवी प्रोग्रामर नहीं हैं, तो आप को चोट पहुंचाने जा रहे हैं।" –