หลักการตั้งชื่อที่เหมาะสมสำหรับ MySQL FKs คืออะไร?


คำตอบ:


146

ใน 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 Server อนุญาตให้คุณปิดใช้งานข้อ จำกัด เฉพาะ หากคุณไม่มี fk ในชื่อคุณต้องยืนยันว่าข้อ จำกัด เป็นข้อ จำกัด ของคีย์ต่างประเทศ ...
OMG Ponies

11
สิ่งที่ฉันชอบทำคือใช้ขีดล่างคู่ระหว่างชื่อตารางอ้างอิงและชื่อตารางที่อ้างอิง สิ่งนี้ช่วยให้คุณได้รับข้อดีสองประการของรายการเรียงตามตัวอักษรที่เก็บ FK ทั้งหมดของตารางไว้ด้วยกันและในเวลาเดียวกันจะช่วยให้คุณหลีกเลี่ยงการชนกันของชื่อ / ความสับสนเมื่อมีชื่อตารางหลายคำ ฉันยังละเว้นส่วนฟิลด์ของชื่อเมื่อมันไม่สำคัญ (เช่นฟิลด์ int เดียวอ้างอิงถึงเอกลักษณ์ PK ของตารางอื่น)
Joel Brown

2
จะเกิดอะไรขึ้นถ้ามีคีย์ต่างประเทศมากกว่า 1 คีย์? ตัวอย่าง: member_id~> เชื่อมโยงไปยังสมาชิกตาราง, edited_id~> คีย์นอกสำหรับผู้ใช้ที่แก้ไขและลิงก์ไปยังสมาชิกตารางด้วย ฉันควรตั้งชื่ออย่างไร
TomSawyer

@ TomSawyer: ฉันเพิ่ม 'pk_' ในคีย์ต่างประเทศทั้งหมดตามด้วยตารางอ้างอิง (เช่น 'สมาชิก') ตามด้วยการใช้งาน / ความรู้สึก (เช่น 'บรรณาธิการ' หรือ 'ผู้แต่ง') ฉันจึงมีบางอย่างเช่น 'pk_members_author' หรือ 'pk_members_editor'
Nrgyzer

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 ดังนั้นจึงต้องระบุให้ชัดเจนว่า id คืออะไร ( 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ตัวแปรที่ไหนสักแห่งโดยไม่รู้ว่าเป็นของตารางใด ยิ่งฐานรหัสของคุณมีอายุมากขึ้นและมีคนทำงานกับฐานข้อมูลมากขึ้นก็จะมีโอกาสมากขึ้น
CJ Dennis

9

หากคุณไม่พบว่าตัวเองอ้างถึง fk ซึ่งมักจะสร้างขึ้นหลังจากที่สร้างขึ้นแล้วทางเลือกหนึ่งคือทำให้มันง่ายและปล่อยให้ MySQL ตั้งชื่อให้คุณ (ตามที่Daniel Vassallo กล่าวไว้ในตอนต้นของคำตอบของเขา )

แม้ว่าคุณจะไม่สามารถ "เดา" ชื่อข้อ จำกัด โดยไม่ซ้ำกันได้ด้วยวิธีนี้ แต่คุณสามารถค้นหาชื่อข้อ จำกัด ของคีย์ต่างประเทศได้อย่างง่ายดายโดยเรียกใช้แบบสอบถาม:

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ไม่ซ้ำกันในฐานข้อมูล วิธีนี้ทำให้ชื่อ Foreign Key อ่านง่ายเช่น:

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หรือไม่?
NguyễnĐứcTâm

@ NguyễnĐứcTâm FK-user_role บทบาท
Văn Quyet
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.