Quy ước đặt tên thích hợp cho MySQL FKs là gì?


Câu trả lời:


141

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_idví 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.


13
Lý do tạo tên tượng trưng là để tham chiếu khi bạn muốn / cần loại bỏ ràng buộc. Oracle & SQL Server cho phép bạn tắt các ràng buộc cụ thể. Nếu bạn không có fk trong tên, bạn phải xác nhận ràng buộc là ràng buộc khóa ngoại ...
OMG Ponies

11
Điều tôi muốn làm là sử dụng dấu gạch dưới kép giữa tên bảng tham chiếu và tên bảng được tham chiếu. Điều này mang lại cho bạn lợi thế kép của việc liệt kê theo thứ tự bảng chữ cái giữ tất cả các FK của bảng lại với nhau và đồng thời giúp bạn tránh va chạm / nhầm lẫn tên khi có nhiều tên bảng từ. Tôi cũng bỏ qua phần trường của tên khi nó tầm thường (tức là một trường int duy nhất tham chiếu đến PK nhận dạng của bảng khác).
Joel Brown,

2
Nếu có nhiều hơn 1 khóa ngoại thì sao? Ví dụ: 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?
TomSawyer

@TomSawyer: Tôi thêm 'pk_' vào tất cả các khóa ngoại, theo sau là bảng tham chiếu (ví dụ: 'thành viên'), tiếp theo là cách sử dụng / ý nghĩa (ví dụ: 'biên tập viên' hoặc 'tác giả'). Vì vậy, tôi có một cái gì đó như 'pk_members_author' hoặc 'pk_members_editor'.
Nrgyzer

28

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 idtrườ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_idtrong messagesbả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ú:

  • , trong một số trường hợp, bạn có thể bỏ qua phần tử thứ hai ([tên trường tham chiếu])
  • fk này có thể là duy nhất, bởi vì nếu một messages_userbả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).


4
Tên có một cách tồn tại qua mã. Cuối cùng, bạn sẽ tìm thấy một $idbiế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.
CJ Dennis

9

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.


1
fk-[referencing_table]-[referencing_field]

Lý do là sự kết hợp của referencing_tablereferencing_fieldlà 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 usertên bảng vào tên khóa ngoại là reduntdant.


Nếu tên cơ sở dữ liệu là user_rolegì? userrolecó mối quan hệ manytomany và user_rolelà bảng chứa tất cả khóa ngoại. Có nên fk_user_role_rolekhông?
Nguyễn Đức Tâm

@ NguyễnĐứcTâm fk-user_role-role
Văn Quyết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.