이 문서는 프로젝트에서 사용할 데이터베이스 객체의 명명 규칙을 정의합니다. 일관성 있는 명명 규칙은 데이터베이스의 구조를 더 쉽게 이해하고, 협업을 원활하게 하며, 유지보수를 용이하게 만드는 것을 목표로 합니다. 본 문서는 Google, Microsoft, Oracle 등 주요 기업의 공식 문서와 업계의 모범 사례를 기반으로 작성되었습니다.
모든 데이터베이스 객체 이름에 공통적으로 적용되는 원칙입니다.
| 원칙 | 설명 | 근거 및 출처 |
|---|---|---|
| 영문 사용 | 모든 식별자는 영문으로 작성합니다. | 국제 표준 및 여러 시스템 간의 호환성을 위함입니다. |
| 소문자 스네이크 케이스 | 모든 이름은 소문자와 언더스코어(_)를 조합한 스네이크 케이스(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]. |
| 규칙 | 설명 | 예시 |
|---|---|---|
| 복수형 명사 사용 | 테이블은 데이터의 집합을 나타내므로, 복수형 명사를 사용합니다. | users, products, order_details |
| 모듈/기능 접두사 (선택) | 대규모 프로젝트에서는 관련 테이블을 그룹화하기 위해 모듈이나 기능 약어를 접두사로 사용할 수 있습니다. | sales_orders, hr_employees |
근거: Oracle E-Business Suite에서는 제품 약어를 접두사로 사용하는 규칙을 제시하며 [7], 이는 테이블의 소속을 명확히 하는 데 도움이 됩니다. 테이블 이름을 복수형으로 사용하는 것은 업계의 일반적인 관례입니다.
| 규칙 | 설명 | 예시 |
|---|---|---|
| 단수형 명사 사용 | 컬럼은 개별 데이터 속성을 나타내므로, 단수형 명사를 사용합니다. | user_name, product_price, order_date |
| 테이블 이름 반복 금지 | 컬럼 이름에 테이블 이름을 포함하지 않습니다. (예: users 테이블의 user_id는 좋지만 users_user_id는 나쁨) | users.id 와 같이 테이블 이름과 함께 사용될 때 의미가 중복되고 불필요하게 길어집니다. |
| 일관된 시스템 컬럼명 | 모든 테이블에 공통적으로 사용되는 시스템 컬럼은 이름을 통일합니다. | created_at, updated_at |
상세 규칙 및 해결책:
id를 기본으로 사용합니다. (예: users 테이블의 PK는 id)_id를 조합합니다. (예: users 테이블을 참조하는 FK는 user_id)created_atupdated_atdeleted_at[event]_at (예: login_at, approved_at)is_ 또는 has_ 접두사를 사용하여 질문 형태로 만듭니다. | is_active, has_permission |근거: Oracle은 테이블 간에 동일한 엔티티를 나타내는 컬럼은 동일한 이름을 사용하도록 권장합니다 [6]. 이는 FK 명명 규칙의 근거가 됩니다. 시스템 컬럼명을 통일하는 것은 사용자가 요청한 '실질적으로 발생할 수 있는 문제 상황'에 대한 해결책으로, 프로젝트의 일관성을 높이고 혼란을 줄입니다.
| 규칙 | 설명 | 예시 |
|---|---|---|
접두사 idx_ 사용 | 인덱스임을 명확히 하기 위해 idx_ 접두사를 사용합니다. | idx_users_on_email |
| 테이블명과 컬럼명 포함 | idx_[테이블명]_on_[컬럼명1]_[컬럼명2] 형식으로 작성하여 어떤 테이블의 어떤 컬럼에 대한 인덱스인지 명확히 합니다. | idx_products_on_category_id_and_price |
| 규칙 | 설명 | 예시 |
|---|---|---|
| 접두사/접미사 사용 | 뷰임을 나타내는 접두사 v_ 또는 접미사 _v를 사용합니다. | v_active_users, order_summary_v |
| 내용 요약 | 뷰가 제공하는 데이터의 내용을 요약하는 이름을 사용합니다. | v_user_order_statistics |
근거: Oracle E-Business Suite 가이드에서는 뷰에 _V 접미사를 사용하는 규칙을 제시합니다 [7].
| 제약조건 유형 | 명명 규칙 | 예시 |
|---|---|---|
| Primary Key | pk_[테이블명] | pk_users |
| Foreign Key | fk_[테이블명]_to_[참조테이블명] | fk_orders_to_users |
| Unique | uq_[테이블명]_[컬럼명] | uq_users_email |
| Check | chk_[테이블명]_[조건] | chk_products_price_positive |
근거: Oracle은 모든 제약조건에 이름을 지정하여 관리의 용이성을 높일 것을 권장하며, _PK, _Fi, _Ui 와 같은 접미사를 사용한 명명 규칙을 제안합니다 [7]. 이는 제약조건 위반 시 발생하는 오류 메시지를 통해 어떤 제약조건에 문제가 있는지 쉽게 파악하는 데 도움이 됩니다.
[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