ऐसा होने के नाते वे अद्वितीय होना चाहिए, मुझे एक MySQL डीबी में एफके का नाम क्या होना चाहिए?MySQL FKs के लिए उचित नामकरण सम्मेलन क्या है?
उत्तर
MySQL में, विदेशी कुंजी बाधाओं को प्रतीकात्मक नाम देने की कोई आवश्यकता नहीं है। यदि कोई नाम नहीं दिया गया है, तो InnoDB स्वचालित रूप से एक अद्वितीय नाम बनाता है।
किसी भी मामले में, इस परंपरा है कि मैं का उपयोग करें:
fk_[referencing table name]_[referenced table name]_[referencing field name]
उदाहरण:
CREATE TABLE users(
user_id int,
name varchar(100)
);
CREATE TABLE messages(
message_id int,
user_id int
);
ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id
FOREIGN KEY (user_id) REFERENCES users(user_id);
मैं user_id
में के रूप में, संदर्भित में एक ही फ़ील्ड का नाम और संदर्भित तालिकाओं के साथ छड़ी करने की कोशिश उपरोक्त उदाहरण में। जब यह व्यावहारिक नहीं है, तो मैं संदर्भित फ़ील्ड नाम को विदेशी कुंजी नाम में भी जोड़ता हूं।
यह नामकरण सम्मेलन मुझे टेबल परिभाषाओं को देखकर प्रतीकात्मक नाम "अनुमान" करने की अनुमति देता है, और इसके अतिरिक्त यह अद्वितीय नामों की भी गारंटी देता है।
एक प्रतीकात्मक नाम बनाने का कारण संदर्भ के लिए है जब आप बाधा को छोड़ना चाहते हैं। ओरेकल और एसक्यूएल सर्वर आपको विशिष्ट बाधाओं को अक्षम करने की अनुमति देता है। यदि आपके पास नाम में एफके नहीं है, तो आपको यह पुष्टि करना होगा कि बाधा एक विदेशी कुंजी बाधा है ... –
मुझे क्या करना पसंद है संदर्भ तालिका नाम और संदर्भित तालिका नाम के बीच एक डबल अंडरस्कोर का उपयोग करना है। यह आपको एक तालिका के सभी एफके को एक साथ रखते हुए वर्णमाला सूचीओं के दोहरे फायदे देता है और साथ ही साथ कई शब्द तालिका नाम होने पर नाम टकराव/भ्रम से बचने में आपकी सहायता करता है। जब मैं छोटा होता हूं तो मैं नाम के क्षेत्र भाग को भी छोड़ देता हूं (यानी एक एकल int फ़ील्ड किसी अन्य तालिका की पहचान पीके का संदर्भ देता है)। –
यदि 1 से अधिक विदेशी कुंजी हैं तो क्या होगा? उदाहरण: 'सदस्य_आईडी' ~> तालिका सदस्य से लिंक,' edited_id' ~> संपादित उपयोगकर्ता के लिए विदेशी कुंजी, तालिका सदस्य से भी लिंक करें। मुझे उन्हें कैसे नामित करना चाहिए? – TomSawyer
मेरी पसंद अलग है। एक "संदेश" में
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
"user_id" तालिका है: मेरी राय में , एक मेज एक "आईडी" क्षेत्र है, न कि "user_id" एक है, इसलिए होना चाहिए क्योंकि तालिका बस "उपयोगकर्ता" कहा जाता है, एफके क्षेत्र इसलिए इसे स्पष्ट करना है कि कौन सी आईडी है ("user_id")।
एक पूरी तरह से आत्म समझा नामकरण सम्मेलन, मेरी राय में, हो सकता है:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: fk_messages_user_id_users_id
ध्यान दें:
- आप कुछ मामले में, दूसरा तत्व को छोड़ सकते हैं ([संदर्भित क्षेत्र नाम])
यह एफके अद्वितीय हो सकता है, क्योंकि यदि "message_user" तालिका मौजूद है, तो संदर्भ फ़ील्ड नाम "user_id" होना चाहिए (और न केवल "आईडी") और एफके नाम होना चाहिए:
fk_messages_user_user_id_users_id
, एक विदेशी कुंजी नामकरण परंपरा अद्वितीय नामों के बारे में आप यह सुनिश्चित कर लें अगर आप भी एक "संदर्भित/संदर्भित क्षेत्र" नामकरण सम्मेलन का उपयोग करें (और आप अपने खुद के लिए चुन सकते हैं, निश्चित रूप से) ।
यदि आप खुद को एफके के संदर्भ में नहीं पाते हैं जो अक्सर बनाए जाते हैं, तो एक विकल्प यह आसान रखना है और MySQL को आपके लिए नामकरण करना है (Daniel Vassallo mentions in the beginning of his answer के रूप में)।
जब आप विशिष्ट "अनुमान" के लिए इस विधि के साथ बाधा नाम में सक्षम नहीं होगा - आप आसानी से एक प्रश्न चलाकर विदेशी कुंजी बाधा नाम पा सकते हैं:
use information_schema;
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME;
उदाहरण के लिए आप प्राप्त हो सकती है क्वेरी से निम्नलिखित:
+------------+-------------+-----------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------+-------------+-----------------+-----------------------+------------------------+
| note | taskid | note_ibfk_2 | task | id |
| note | userid | note_ibfk_1 | user | id |
| task | userid | task_ibfk_1 | user | id |
+------------+-------------+-----------------+-----------------------+------------------------+
यदि यह अतिरिक्त कदम आप के लिए बहुत ज्यादा नहीं है, तो आप आसानी से FK आप देख रहे हैं खोजने के लिए सक्षम होना चाहिए।
- 1. क्या MySQL के लिए नामकरण सम्मेलन है?
- 2. सी # नामकरण सम्मेलनों के लिए नामकरण सम्मेलन
- 3. इस नामकरण सम्मेलन क्या है?
- 4. धागे के लिए नामकरण सम्मेलन?
- 5. नामकरण सम्मेलन?
- 6. एमएसवीसी डीएलएस, स्थिर पुस्तकालयों और आयात पुस्तकालयों के लिए उचित नामकरण सम्मेलन क्या है
- 7. आंशिक कक्षा फ़ाइलों के लिए नामकरण सम्मेलन
- 8. नई परियोजनाओं के लिए नामकरण सम्मेलन
- 9. AJAX नामकरण सम्मेलन
- 10. आरएआईआई कक्षाओं के लिए एक आम नामकरण सम्मेलन क्या है?
- 11. सहायक कार्यों के लिए आपका नामकरण सम्मेलन क्या है?
- 12. क्या WPF UI नियंत्रणों के लिए मानक नामकरण सम्मेलन है?
- 13. पायथन कक्षा संदर्भों के लिए नामकरण सम्मेलन क्या है
- 14. व्यू आईडी के लिए आपका नामकरण सम्मेलन क्या है?
- 15. आईडी नामकरण सम्मेलन?
- 16. neo4j नामकरण सम्मेलन क्या हैं?
- 17. रेल माइग्रेशन के लिए नामकरण सम्मेलन
- 18. एचटीएमएल तत्वों के लिए नामकरण सम्मेलन
- 19. कमांड और घटनाओं के लिए नामकरण सम्मेलन
- 20. डीबी ट्रिगर्स के लिए नामकरण सम्मेलन
- 21. अद्वितीय बाधा के लिए नामकरण सम्मेलन
- 22. विकल्पों के लिए स्कैला नामकरण सम्मेलन
- 23. एचटीएमएल: आईडी विशेषताओं के लिए नामकरण सम्मेलन
- 24. स्कैला स्थिरांक के लिए नामकरण सम्मेलन?
- 25. Django विचारों के लिए नामकरण सम्मेलन?
- 26. वीबीएनईटी निजी क्षेत्रों के लिए नामकरण सम्मेलन
- 27. राज्य/क्षेत्र/प्रांत के लिए नामकरण सम्मेलन
- 28. जेएसओएन क्रियाओं के लिए एमवीसी नामकरण सम्मेलन
- 29. मॉड्यूल के लिए पाइथन नामकरण सम्मेलन
- 30. आम पैटर्न के लिए नामकरण सम्मेलन?
http: // stackoverflow।कॉम/प्रश्न/199498/विदेशी-कुंजी-नामकरण-योजना – trante