Câu trả lời:
Trong MySQL, không cần đặt tên tượng trưng cho các ràng buộc khóa ngoại. Nếu không có tên, InnoDB sẽ tự động tạo một tên duy nhất.
Trong mọi trường hợp, đây là quy ước mà tôi sử dụng:
fk_[referencing table name]_[referenced table name]_[referencing field name]
Thí dụ:
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);
Tôi cố gắng gắn các tên trường giống nhau trong các bảng tham chiếu và được tham chiếu, như trong user_id
ví dụ trên. Khi điều này không thực tế, tôi cũng nối tên trường được tham chiếu với tên khóa ngoại.
Quy ước đặt tên này cho phép tôi "đoán" tên tượng trưng chỉ bằng cách nhìn vào các định nghĩa của bảng, và ngoài ra nó cũng đảm bảo các tên duy nhất.
member_id
~> liên kết đến thành viên trong bảng, edited_id
~> khóa ngoại cho người dùng đã chỉnh sửa, cũng liên kết đến thành viên trong bảng. Tôi nên đặt tên cho chúng như thế nào?
sự lựa chọn của tôi là khác nhau. theo ý kiến của tôi, một bảng nên có một id
trường, không phải một user_id
, bởi vì bảng chỉ được gọi user
, vì vậy:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
user_id
trong messages
bảng là trường fk nên nó phải làm rõ id là ( user_id
).
một quy ước đặt tên hoàn toàn tự giải thích, theo ý kiến của tôi, có thể là:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: `fk_messages_user_id_users_id`
Ghi chú:
fk này có thể là duy nhất, bởi vì nếu một messages_user
bảng tồn tại, tên trường tham chiếu phải là user_id
(và không chỉ id
) và tên fk phải là:
fk_messages_user_user_id_users_id
nói cách khác, quy ước đặt tên khóa ngoại đảm bảo bạn chắc chắn về các tên duy nhất nếu bạn cũng sử dụng quy ước đặt tên "trường tham chiếu / trường được tham chiếu" (và tất nhiên bạn có thể chọn của riêng mình).
$id
biến ở đâu đó mà không biết nó thuộc về bảng nào. Cơ sở mã của bạn càng cũ và càng có nhiều người làm việc trên nó, thì điều này càng có nhiều khả năng xảy ra.
Nếu bạn không thấy mình thường xuyên tham khảo fk's sau khi chúng được tạo, một lựa chọn là giữ cho nó đơn giản và để MySQL thực hiện việc đặt tên cho bạn (như Daniel Vassallo đã đề cập trong phần đầu câu trả lời của mình ).
Mặc dù bạn sẽ không thể "đoán" duy nhất các tên ràng buộc bằng phương pháp này - bạn có thể dễ dàng tìm thấy tên ràng buộc khóa ngoại bằng cách chạy truy vấn:
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;
Ví dụ: bạn có thể nhận được thông tin sau từ truy vấn:
+------------+-------------+-----------------+-----------------------+------------------------+
| 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 |
+------------+-------------+-----------------+-----------------------+------------------------+
Nếu bước bổ sung này không quá nhiều đối với bạn, thì bạn sẽ có thể dễ dàng tìm thấy fk bạn đang tìm kiếm.
fk-[referencing_table]-[referencing_field]
Lý do là sự kết hợp của referencing_table
và referencing_field
là duy nhất trong một cơ sở dữ liệu. Cách này làm cho tên khóa ngoại dễ đọc, ví dụ:
table `user`:
id
name
role
table `article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */
Vì vậy, chúng tôi có hai khóa ngoại:
fk-article-created_user_id
fk-article-reviewed_user_id
Thêm user
tên bảng vào tên khóa ngoại là reduntdant.
user_role
gì? user
và role
có mối quan hệ manytomany và user_role
là bảng chứa tất cả khóa ngoại. Có nên fk_user_role_role
không?