MySQL FKs के लिए एक उचित नामकरण सम्मेलन क्या है?


जवाबों:


142

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उदाहरणों और संदर्भित तालिकाओं में समान फ़ील्ड नामों के साथ छड़ी करने की कोशिश करता हूं, जैसा कि ऊपर दिए गए उदाहरण में है। जब यह व्यावहारिक नहीं होता है, तो मैं संदर्भित फ़ील्ड नाम को विदेशी कुंजी नाम के साथ जोड़ देता हूं।

यह नामकरण सम्मेलन मुझे प्रतीकात्मक नाम "अनुमान" करने की अनुमति देता है बस तालिका परिभाषाओं को देखकर, और इसके अलावा यह अद्वितीय नामों की गारंटी भी देता है।


13
एक प्रतीकात्मक नाम बनाने का कारण यह है कि जब आप बाधा डालना चाहते हैं, तो संदर्भित करने के लिए। Oracle और SQL सर्वर आपको विशिष्ट बाधाओं को अक्षम करने की अनुमति देता है। यदि आपके पास नाम में fk नहीं है, तो आपको पुष्टि करनी होगी कि बाधा एक विदेशी कुंजी है ...
OMG Ponies

11
मुझे क्या करना पसंद है संदर्भ तालिका नाम और संदर्भित तालिका नाम के बीच एक डबल अंडरस्कोर का उपयोग करें। यह आपको तालिका के सभी FK को एक साथ रखने और एक ही समय में कई शब्द तालिका नाम होने पर नाम टकराव / भ्रम से बचने में मदद करने के साथ वर्णमाला लिस्टिंग के दोहरे फायदे प्रदान करता है। मैं नाम के क्षेत्र भाग को भी छोड़ देता हूं जब यह तुच्छ होता है (अर्थात एक एकल अंतर फ़ील्ड किसी अन्य तालिका की पहचान PK का संदर्भ देता है)।
जोएल ब्राउन

2
यदि 1 से अधिक विदेशी कुंजी हैं तो क्या होगा? उदाहरण: member_id~> तालिका सदस्य के लिए लिंक, edited_id~ संपादित उपयोगकर्ता के लिए विदेशी कुंजी, तालिका सदस्य के लिए लिंक भी। मुझे उनका नाम कैसे देना चाहिए?
टॉमस्वर

@TomSawyer: मैं सभी विदेशी कुंजियों में 'pk_' जोड़ देता हूं, उसके बाद संदर्भित तालिका (जैसे 'सदस्य'), उसके बाद उपयोग / अर्थ (जैसे 'संपादक' या 'लेखक')। इसलिए मेरे पास 'pk_members_author' या 'pk_members_editor' जैसा कुछ है।
नर्गिज़ेर

28

मेरी पसंद अलग है। मेरी राय में, एक टेबल में एक 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

दूसरे शब्दों में, एक विदेशी कुंजी नामकरण सम्मेलन आपको अद्वितीय नामों के बारे में सुनिश्चित करता है यदि आप "संदर्भित / संदर्भित क्षेत्र" नामकरण सम्मेलन का उपयोग करते हैं (और आप निश्चित रूप से अपना खुद का चयन कर सकते हैं)।


4
नामों में पूरे कोड को बनाए रखने का एक तरीका है। आखिरकार, आपको एक $idचर मिल जाएगा जिसमें कोई विचार नहीं होगा कि वह किस तालिका से संबंधित है। आपका पुराना कोड आधार है और जितने अधिक लोगों ने इस पर काम किया है, उतनी ही अधिक संभावना है।
सीजे डेनिस

9

यदि आप अपने आप को 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 को आसानी से खोजने में सक्षम होना चाहिए जिसे आप खोज रहे हैं।


1
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?
गुयेन Tc Tâm

@ Nguy -nĐứcTâm fk-user_role-role
Văn Quyết
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.