Database Object Naming Convention

이강현·2025년 10월 16일

데이터베이스 네이밍 컨벤션

1. 소개

이 문서는 프로젝트에서 사용할 데이터베이스 객체의 명명 규칙을 정의합니다. 일관성 있는 명명 규칙은 데이터베이스의 구조를 더 쉽게 이해하고, 협업을 원활하게 하며, 유지보수를 용이하게 만드는 것을 목표로 합니다. 본 문서는 Google, Microsoft, Oracle 등 주요 기업의 공식 문서와 업계의 모범 사례를 기반으로 작성되었습니다.

2. 일반 원칙

모든 데이터베이스 객체 이름에 공통적으로 적용되는 원칙입니다.

원칙설명근거 및 출처
영문 사용모든 식별자는 영문으로 작성합니다.국제 표준 및 여러 시스템 간의 호환성을 위함입니다.
소문자 스네이크 케이스모든 이름은 소문자와 언더스코어(_)를 조합한 스네이크 케이스(snake_case)를 사용합니다. (예: order_details)데이터베이스 시스템 및 운영체제 간의 대소문자 구분 정책 차이로 인한 문제를 예방합니다. PostgreSQL은 따옴표 없는 식별자를 소문자로 처리하며 [1], MySQL은 lower_case_table_names 설정에 따라 동작이 달라져 이식성을 위해 소문자 사용이 권장됩니다 [2].
예약어 사용 금지각 데이터베이스 시스템에서 사용하는 예약어는 식별자로 사용할 수 없습니다. (예: order, select, group)예약어는 SQL 문법에서 특별한 의미를 가지므로, 식별자로 사용 시 예기치 않은 오류를 발생시킬 수 있습니다. 각 RDBMS는 자체적인 예약어 목록을 가지고 있습니다 [3][4][5].
의미 있는 이름 사용객체의 이름은 그 역할과 내용을 명확하게 설명할 수 있어야 합니다.Oracle은 완전하고, 설명적이며, 발음 가능한 이름을 사용할 것을 권장합니다. 이는 시간이 지나도 다른 개발자가 쉽게 이해할 수 있도록 돕습니다. (예: pmdd 대신 payment_due_date) [6].
약어 사용 지양의미를 명확하게 전달할 수 있는 경우를 제외하고는 임의의 약어 사용을 지양합니다.약어는 개발자마다 다르게 해석될 수 있어 혼란을 야기할 수 있습니다. Oracle은 잘 알려진 약어가 아니라면 전체 이름을 사용할 것을 권장합니다 [6].
접두사/접미사 일관성특정 목적을 가진 객체에는 일관된 접두사 또는 접미사를 사용합니다.Oracle E-Business Suite 가이드에서는 테이블, 뷰, 제약조건 등에 특정 접미사(_V, _PK, _FK)를 사용하여 객체 유형을 명확히 구분하는 규칙을 제시합니다 [7].
길이 제한 준수각 데이터베이스 시스템의 식별자 길이 제한을 준수합니다.Google Cloud Spanner는 최대 128자 [8], MySQL은 64자 [9], PostgreSQL은 63바이트 [1], Oracle은 호환성 수준에 따라 30 또는 128바이트 [6]의 길이 제한을 가집니다. 범용성을 위해 63자 이내로 작성하는 것을 권장합니다.
숫자로 시작 금지식별자는 숫자로 시작할 수 없습니다.대부분의 데이터베이스 시스템에서 식별자는 문자로 시작해야 한다는 규칙을 따릅니다 [1][4][7].

3. 객체별 명명 규칙

3.1. 테이블 (Tables)

규칙설명예시
복수형 명사 사용테이블은 데이터의 집합을 나타내므로, 복수형 명사를 사용합니다.users, products, order_details
모듈/기능 접두사 (선택)대규모 프로젝트에서는 관련 테이블을 그룹화하기 위해 모듈이나 기능 약어를 접두사로 사용할 수 있습니다.sales_orders, hr_employees

근거: Oracle E-Business Suite에서는 제품 약어를 접두사로 사용하는 규칙을 제시하며 [7], 이는 테이블의 소속을 명확히 하는 데 도움이 됩니다. 테이블 이름을 복수형으로 사용하는 것은 업계의 일반적인 관례입니다.

3.2. 컬럼 (Columns)

규칙설명예시
단수형 명사 사용컬럼은 개별 데이터 속성을 나타내므로, 단수형 명사를 사용합니다.user_name, product_price, order_date
테이블 이름 반복 금지컬럼 이름에 테이블 이름을 포함하지 않습니다. (예: users 테이블의 user_id는 좋지만 users_user_id는 나쁨)users.id 와 같이 테이블 이름과 함께 사용될 때 의미가 중복되고 불필요하게 길어집니다.
일관된 시스템 컬럼명모든 테이블에 공통적으로 사용되는 시스템 컬럼은 이름을 통일합니다.created_at, updated_at

상세 규칙 및 해결책:

  • Primary Key 컬럼: id를 기본으로 사용합니다. (예: users 테이블의 PK는 id)
  • Foreign Key 컬럼: 참조하는 테이블의 단수형 이름과 _id를 조합합니다. (예: users 테이블을 참조하는 FK는 user_id)
  • 날짜/시간 컬럼: 혼선을 피하기 위해 다음과 같이 명명 규칙을 통일합니다.
    • 생성 시점: created_at
    • 수정 시점: updated_at
    • 삭제 시점 (논리적 삭제): deleted_at
    • 특정 이벤트 발생 시점: [event]_at (예: login_at, approved_at)
  • Boolean 타입 컬럼: is_ 또는 has_ 접두사를 사용하여 질문 형태로 만듭니다. | is_active, has_permission |

근거: Oracle은 테이블 간에 동일한 엔티티를 나타내는 컬럼은 동일한 이름을 사용하도록 권장합니다 [6]. 이는 FK 명명 규칙의 근거가 됩니다. 시스템 컬럼명을 통일하는 것은 사용자가 요청한 '실질적으로 발생할 수 있는 문제 상황'에 대한 해결책으로, 프로젝트의 일관성을 높이고 혼란을 줄입니다.

3.3. 인덱스 (Indexes)

규칙설명예시
접두사 idx_ 사용인덱스임을 명확히 하기 위해 idx_ 접두사를 사용합니다.idx_users_on_email
테이블명과 컬럼명 포함idx_[테이블명]_on_[컬럼명1]_[컬럼명2] 형식으로 작성하여 어떤 테이블의 어떤 컬럼에 대한 인덱스인지 명확히 합니다.idx_products_on_category_id_and_price

34. 뷰 (Views)

규칙설명예시
접두사/접미사 사용뷰임을 나타내는 접두사 v_ 또는 접미사 _v를 사용합니다.v_active_users, order_summary_v
내용 요약뷰가 제공하는 데이터의 내용을 요약하는 이름을 사용합니다.v_user_order_statistics

근거: Oracle E-Business Suite 가이드에서는 뷰에 _V 접미사를 사용하는 규칙을 제시합니다 [7].

3.5. 제약조건 (Constraints)

제약조건 유형명명 규칙예시
Primary Keypk_[테이블명]pk_users
Foreign Keyfk_[테이블명]_to_[참조테이블명]fk_orders_to_users
Uniqueuq_[테이블명]_[컬럼명]uq_users_email
Checkchk_[테이블명]_[조건]chk_products_price_positive

근거: Oracle은 모든 제약조건에 이름을 지정하여 관리의 용이성을 높일 것을 권장하며, _PK, _Fi, _Ui 와 같은 접미사를 사용한 명명 규칙을 제안합니다 [7]. 이는 제약조건 위반 시 발생하는 오류 메시지를 통해 어떤 제약조건에 문제가 있는지 쉽게 파악하는 데 도움이 됩니다.


4. 참고문헌

[1] PostgreSQL. "Lexical Structure". https://www.postgresql.org/docs/current/sql-syntax-lexical.html

[2] MySQL. "Identifier Case Sensitivity". https://dev.mysql.com/doc/refman/8.4/en/identifier-case-sensitivity.html

[3] Microsoft. "Reserved Keywords (Transact-SQL)". https://learn.microsoft.com/en-us/sql/t-sql/language-elements/reserved-keywords-transact-sql?view=sql-server-ver17

[4] Oracle. "Database Object Naming Rules". https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Database-Object-Names-and-Qualifiers.html

[5] Google Cloud. "Reserved keywords". https://cloud.google.com/spanner/docs/reference/standard-sql/data-definition-language#reserved_keywords

[6] Oracle. "Schema Object Naming Guidelines". https://docs.oracle.com/en/database/oracle/oracle-database/23/sqlrf/Database-Object-Names-and-Qualifiers.html#GUID-54232D44-42D7-4456-A04B-8797849839E3

[7] Oracle. "Naming Standards". https://docs.oracle.com/cd/E18727_01/doc.121/e12897/T302934T458266.htm

[8] Google Cloud. "Names". https://cloud.google.com/spanner/docs/reference/standard-sql/data-definition-language#names

[9] MySQL. "Identifier Length Limits". https://dev.mysql.com/doc/mysql-reslimits-excerpt/5.7/en/identifier-length.html

profile
백엔드 개발자 지망생입니다.

0개의 댓글