2010-02-10 9 views
73

ऐसा होने के नाते वे अद्वितीय होना चाहिए, मुझे एक MySQL डीबी में एफके का नाम क्या होना चाहिए?MySQL FKs के लिए उचित नामकरण सम्मेलन क्या है?

+0

http: // stackoverflow।कॉम/प्रश्न/199498/विदेशी-कुंजी-नामकरण-योजना – trante

उत्तर

98

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

एक प्रतीकात्मक नाम बनाने का कारण संदर्भ के लिए है जब आप बाधा को छोड़ना चाहते हैं। ओरेकल और एसक्यूएल सर्वर आपको विशिष्ट बाधाओं को अक्षम करने की अनुमति देता है। यदि आपके पास नाम में एफके नहीं है, तो आपको यह पुष्टि करना होगा कि बाधा एक विदेशी कुंजी बाधा है ... –

+9

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

+2

यदि 1 से अधिक विदेशी कुंजी हैं तो क्या होगा? उदाहरण: 'सदस्य_आईडी' ~> तालिका सदस्य से लिंक,' edited_id' ~> संपादित उपयोगकर्ता के लिए विदेशी कुंजी, तालिका सदस्य से भी लिंक करें। मुझे उन्हें कैसे नामित करना चाहिए? – TomSawyer

22

मेरी पसंद अलग है। एक "संदेश" में

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

दूसरे शब्दों में

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

7

यदि आप खुद को एफके के संदर्भ में नहीं पाते हैं जो अक्सर बनाए जाते हैं, तो एक विकल्प यह आसान रखना है और 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 आप देख रहे हैं खोजने के लिए सक्षम होना चाहिए।

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