Vì chúng phải là duy nhất, tôi nên đặt tên FK là gì trong một DB MySQL?Quy ước đặt tên thích hợp cho MySQL FK là gì?
Trả lời
Trong MySQL, không cần đặt tên biểu tượng cho các ràng buộc khóa ngoài. Nếu tên không được cung cấp, 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]
Ví 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 bó với tên trường cùng tham khảo và bảng tham chiếu, như trong user_id
trong ví dụ trên. Khi điều này là không thực tế, tôi cũng nối thêm tên trường được tham chiếu vào tên khóa ngoài.
Quy ước đặt tên này cho phép tôi "đoán" tên biểu tượng chỉ bằng cách xem các định nghĩa bảng và ngoài ra nó cũng đảm bảo các tên duy nhất.
Lý do tạo một tên tượng trưng là để tham chiếu khi bạn muốn/cần phải bỏ ràng buộc. Oracle & SQL Server cho phép bạn vô hiệu hóa 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à một ràng buộc khoá ngoại ... –
Đ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 những lợi thế kép của danh sách theo thứ tự chữ cái giữ tất cả các FK của bảng cùng nhau và đồng thời giúp bạn tránh va chạm tên/nhầm lẫ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ó là tầm thường (nghĩa là một trường int đơn tham chiếu đến danh tính PK của một bảng khác). –
Điều gì xảy ra nếu có nhiều hơn 1 khóa ngoại? Ví dụ: 'member_id' ~> liên kết đến thành viên bảng,' edit_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 bảng. Làm thế nào tôi nên đặt tên cho họ? – TomSawyer
lựa chọn của tôi là khác nhau. theo ý kiến của tôi, một bảng cần phải có một "id" lĩnh vực, không phải là một "user_id" một, vì bảng chỉ được gọi là "người sử dụng", vì vậy:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
"user_id" trong "thông điệp" bảng là một fk lĩnh vực vì vậy nó đã làm cho rõ ràng mà id là ("user_id").
một quy ước đặt tên đầy đủ 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
lưu ý:
- bạn có thể, trong một số trường hợp, bỏ qua các yếu tố thứ hai ([tham khảo lĩnh vực name])
fk này có thể là duy nhất, vì nếu bảng "messages_user" 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, một quy ước đặt tên chính nước ngoài làm cho bạn chắc chắn về tên duy nhất nếu bạn cũng sử dụng một "tham khảo/lĩnh vực tham chiếu" quy ước đặt tên (và bạn có thể chọn riêng của bạn, tất nhiên) .
Nếu bạn không thấy mình tham chiếu fk thường xuyên sau khi chúng được tạo, một tùy chọn là giữ cho nó đơn giản và để MySQL đặt tên cho bạn (như Daniel Vassallo mentions in the beginning of his answer).
Trong khi bạn sẽ không thể duy nhất "đoán" những cái tên khó khăn với phương pháp này - bạn có thể dễ dàng tìm ra tên ràng buộc khoá ngoại bằng cách chạy một 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 sau 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 cho bạn, bạn có thể dễ dàng tìm thấy fk bạn đang tìm kiếm.
- 1. Quy ước đặt tên: Đặt tên biến boolean là gì?
- 2. Quy ước đặt tên tập tin javascript là gì?
- 3. Quy ước đặt tên cho Traits PHP?
- 4. Tất cả các quy ước đặt tên là gì?
- 5. Quy ước đặt tên Django
- 6. Quy ước đặt tên trong C# là gì?
- 7. Quy ước đặt tên AJAX
- 8. Quy ước đặt tên Ruby?
- 9. Quy ước đặt tên - Làm việc với PHP và MySQL
- 10. Quy ước đặt tên F #
- 11. quy ước đặt tên serialVersionUID
- 12. Quy ước đặt tên tốt cho các trường và trình truy cập trong C++ là gì?
- 13. Quy ước đặt tên ID trong ASP.NET?
- 14. Quy ước đặt tên phổ biến cho các lớp RAII là gì?
- 15. Quy ước đặt tên cho Phương thức Nhà máy là gì?
- 16. Quy ước đặt tên Scala cho các tùy chọn
- 17. Có quy ước đặt tên cho các ứng dụng Django
- 18. Quy ước đặt tên dễ đọc hơn cho các bảng tra cứu là gì?
- 19. Quy ước đặt tên tốt cho vars, phương pháp, vv trong C++ là gì?
- 20. Quy ước đặt tên của bạn cho các chức năng trợ giúp là gì?
- 21. Quy ước đặt tên khóa Redis?
- 22. Quy ước đặt tên biến số
- 23. Quy ước đặt tên cho các dự án mới
- 24. Quy ước đặt tên thử nghiệm .NET
- 25. Quy ước đặt tên tuân thủ CLS phù hợp cho các trường được bảo vệ là gì?
- 26. Quy ước đặt tên tham số bitmask?
- 27. Quy ước đặt tên cho chế độ xem Django?
- 28. quy ước đặt tên cho các phần tử html
- 29. Quy ước đặt tên cho các trường riêng VB.NET
- 30. Quy ước đặt tên cho các tệp lớp một phần
http: // stackoverflow.com/questions/199498/external-keying-scheme – trante