होने के नाते वे अद्वितीय होना चाहिए, मुझे एक MySQL DB में FK का नाम क्या होना चाहिए?
जवाबों:
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
उदाहरणों और संदर्भित तालिकाओं में समान फ़ील्ड नामों के साथ छड़ी करने की कोशिश करता हूं, जैसा कि ऊपर दिए गए उदाहरण में है। जब यह व्यावहारिक नहीं होता है, तो मैं संदर्भित फ़ील्ड नाम को विदेशी कुंजी नाम के साथ जोड़ देता हूं।
यह नामकरण सम्मेलन मुझे प्रतीकात्मक नाम "अनुमान" करने की अनुमति देता है बस तालिका परिभाषाओं को देखकर, और इसके अलावा यह अद्वितीय नामों की गारंटी भी देता है।
member_id
~> तालिका सदस्य के लिए लिंक, edited_id
~ संपादित उपयोगकर्ता के लिए विदेशी कुंजी, तालिका सदस्य के लिए लिंक भी। मुझे उनका नाम कैसे देना चाहिए?
मेरी पसंद अलग है। मेरी राय में, एक टेबल में एक id
फ़ील्ड होना चाहिए, एक नहीं user_id
, क्योंकि टेबल को बस कहा जाता है user
, इसलिए:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
user_id
में messages
तो यह स्पष्ट है जो आईडी है बनाने के लिए है मेज एक FK क्षेत्र है ( user_id
)।
एक पूरी तरह से आत्म-व्याख्यात्मक नामकरण सम्मेलन, मेरी राय में, हो सकता है:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: `fk_messages_user_id_users_id`
ध्यान दें:
यह fk अद्वितीय हो सकता है, क्योंकि यदि कोई messages_user
तालिका मौजूद है, तो संदर्भ फ़ील्ड नाम होना चाहिए user_id
(और सिर्फ नहीं id
) और fk होना चाहिए:
fk_messages_user_user_id_users_id
दूसरे शब्दों में, एक विदेशी कुंजी नामकरण सम्मेलन आपको अद्वितीय नामों के बारे में सुनिश्चित करता है यदि आप "संदर्भित / संदर्भित क्षेत्र" नामकरण सम्मेलन का उपयोग करते हैं (और आप निश्चित रूप से अपना खुद का चयन कर सकते हैं)।
$id
चर मिल जाएगा जिसमें कोई विचार नहीं होगा कि वह किस तालिका से संबंधित है। आपका पुराना कोड आधार है और जितने अधिक लोगों ने इस पर काम किया है, उतनी ही अधिक संभावना है।
यदि आप अपने आप को fk के संदर्भ में नहीं पाते हैं, जो कि उनके बनने के बाद अक्सर होता है, तो एक विकल्प यह है कि इसे सरल रखें और MySQL को आपके लिए नामकरण दें (जैसा कि डैनियल वासल्लो ने अपने उत्तर की शुरुआत में उल्लेख किया है )।
यद्यपि आप इस विधि के साथ बाधा नामों को विशिष्ट रूप से "अनुमान" नहीं कर पाएंगे - आप एक क्वेरी चलाकर आसानी से विदेशी कुंजी बाधा नाम पा सकते हैं:
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 को आसानी से खोजने में सक्षम होना चाहिए जिसे आप खोज रहे हैं।
fk-[referencing_table]-[referencing_field]
इसका कारण एक डेटाबेस में संयोजन referencing_table
और referencing_field
अद्वितीय है। इस तरह से विदेशी कुंजी नाम को पढ़ना आसान है, उदाहरण के लिए:
table `user`:
id
name
role
table `article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */
इसलिए हमारे पास दो विदेशी चाबियां हैं:
fk-article-created_user_id
fk-article-reviewed_user_id
user
विदेशी कुंजी नाम में तालिका का नाम जोड़ना पुनर्मूल्यांकन है।
user_role
? user
और role
कई रिश्ते हैं और user_role
वह तालिका जिसमें सभी विदेशी कुंजी शामिल हैं। क्या यह होना चाहिए fk_user_role_role
?