เนื่องจากต้องไม่ซ้ำกันฉันควรตั้งชื่อ FK ใน MySQL DB อย่างไร
เนื่องจากต้องไม่ซ้ำกันฉันควรตั้งชื่อ FK ใน MySQL DB อย่างไร
คำตอบ:
ใน 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 ดังนั้นจึงต้องระบุให้ชัดเจนว่า 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
กล่าวอีกนัยหนึ่งหลักการตั้งชื่อคีย์ต่างประเทศทำให้คุณมั่นใจได้ว่าชื่อที่ไม่ซ้ำกันหากคุณใช้หลักการตั้งชื่อ "ฟิลด์อ้างอิง / อ้างอิง" ด้วย (และแน่นอนคุณสามารถเลือกของคุณเองได้)
$id
ตัวแปรที่ไหนสักแห่งโดยไม่รู้ว่าเป็นของตารางใด ยิ่งฐานรหัสของคุณมีอายุมากขึ้นและมีคนทำงานกับฐานข้อมูลมากขึ้นก็จะมีโอกาสมากขึ้น
หากคุณไม่พบว่าตัวเองอ้างถึง 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 ที่คุณต้องการได้อย่างง่ายดาย
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
หรือไม่?