MySQL FK에 대한 적절한 명명 규칙은 무엇입니까?


답변:


142

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 필드가 다른 테이블의 ID PK를 참조 함).
Joel Brown

2
외래 키가 두 개 이상 있으면 어떻게됩니까? 예 : 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_idin messagestable은 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_tablereferencing_field데이터베이스에서 고유 한 조합 때문입니다 . 이렇게하면 외래 키 이름을 쉽게 읽을 수 있습니다. 예를 들면 다음과 같습니다.

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무엇입니까? userrolemanytomany 관계를 가지고 user_role모든 외부 키를 포함하는 테이블입니다. 그럴까요 fk_user_role_role?
Nguyễn Đức Tâm

@ NguyễnĐứcTâm FK-USER_ROLE - 역할
반 Quyết
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.