들어가며
최근 회사에서 프로젝트 하나를 맡았다. 개발을 하기에 앞서 기능을 구현하기 위해 새로운 테이블이 필요했기에 테이블을 생성하기 전 설계를 진행했었다.
프로젝트 기획서를 정독하며 모델링을 한 후 DBA에게 모델링 검수를 맡는 과정에서 comlumn 네이밍 원칙을 제시 받아 이를 정리 해보고자 한다.
회사 한해서 사용하는것이기는 하지만 그 만큼 효율적인 원칙이라 익혀두는것도 나쁘지 않다고 생각한다.
동일한 데이터는 동일한 용어(colmun명)로 정의한다
팝업 이미지를 속성으로 가지고 있는 popup 테이블이 존재하고 해당 팝업 이미지 정보를 가지고있는 image 테이블이 존재한다고 가정해보자.
image 테이블의 image_id와 popup 테이블의 popup_image_id는 식별관계를 맺고있기 때문에 동일한 데이터를 가지고 있다.
하지만 테이블을 직접 설계하지 않은 사용자 입장에서는 동일한 데이터를 가지는지? 아니면 서로 다른 데이터를 가지는지? 의문이 들 수 있다.
동일한 데이터를 가진다는 것을 표현하기 위해 popup_image_id이라는 컬럼명을 image 테이블의 image_id 컬럼명과 동일하게 변경 해주어야 한다.
의미의 한정이나 구분 필요시 동일 용어 앞에 수식어를 붙이자
의미의 한정된 개념을 표현하는 수식어는 다른 테이블의 컬럼과 구분되기 위해 보통 PK 속성을 가지는 컬럼명 앞에 일반적으로 붙였을 것이다. (Ex mamber_id, product_id 등)
PK 속성을 가지는 컬럼뿐만 아닌 이외의 컬럼에도 한정된 개념이나 구분이 필요하다면 수식어를 컬럼명 앞에 붙이면 된다.
popup의 노출 상태의 정보를 가지는 컬럼이 필요하다면 아래와 같이 추가 될 수 있다.
해당 데이터베이스가 image와 popup 테이블만 가지고 있다면 문제가 되지 않는다. 그러나 exposure_status_code를 가지는 테이블이 또 존재한다면 어떻게 될까?
각 테이블의 exposure_status_code가 서로 동일한데이터를 가진다면 문제가 되지 않지만 서로 다른 데이터를 가짐과 동시에 컬럼명이 동일 하다면 제 3자가 그 의미를 파악하기 어려울것이다.
(Ex popup 테이블의 exposure_status_code는 popup기능에 한정해서 사용되는 코드일 경우)
또한 사이드 이펙트가 발생할 여지도 충분히 남긴다.
따라서 그림과 같이 각 exposure_status_code 컬럼명 앞에 각 개념을 한정지을 수 있는 수식어를 붙여 구분시켜주어야한다.
불필요한 단어는 제외하자
개발시 메서드 이름을 짓거나 또는 파일명 등을 지을 때 구체적으로 짓는것은 좋은 습관이다. (추상화 네이밍은 예외다..)
테이블의 컬럼명을 지을 때도 똑같이 적용된다.
그러나 너무 상세하게 적는경우 컬럼명을 읽는 사용자 입장에서는 명확히 이해 할 수는 있겠지만 컬러명이 굉장히 길어질 수 있다.
이런 문제는 불필요한 단어를 제거함으로써 보다 깔끔하고 명확한 컬럼명으로 수정할 수 있다.
다음 컬럼명을 살펴보자.
"popup_connection_web_url_target_type_code"
한글로 직역하면 "팝업 연결 웹 URL 타겟 타입 코드"이다.
말 그대로 사용자가 팝업을 클릭 하면 해당 링크로 페이지가 이동되는데 현재창에서 열릴지 아니면 새창에서 열릴지 구분하는 코드이다.
code값은 BLANK, SELF를 가질 수 있다고 가정하자.
"connection"는 컬럼명에 이미 popup, url 단어가 들어가므로 사용자는 링크기능을 수행한다는 것을 알아 챌 수 있다. 그러므로 불필요한 단어다.
"web"은 만약 다른 컬럼에 "web" 대신 "app"을 사용하는 "popup_connection_app_url_target_type_code" 컬럼이 존재한다면 "web"이 수식어로 필요하겠지만 그렇지 않으니 불필요한 단어다.
"url"은 링크기능을 수행한다는 중요한 단어이기 때문에 필요하다.
"target"은 만약 테이블에 "url_target_type_code" 뿐만 아니라 "url_encryption_type_code" 와 같이 url 암호화 방식을 결정하는 컬럼이 존재한다면 "target"은 "url_encryption_type_code"와 구분지을 수 있는 중요한 수식어가 되지만 "url_encryption_type_code"은 존재 하지 않으므로 불필요한 단어다.
마지막으로 맨앞 "popup" 은 "url_type_code"가 popup에서만 한정된 개념이라면 "popup" 수식어 역할을 하지만 "url_type_code"는 이미 다른 테이블에서도 사용하는 코드이며 BLANK, SELF와 같은 데이터를 가지므로 불필요한 단어다.
결과적으로 "url_type_code" 으로 컬럼명을 간결하고 명확하게 줄일 수 있다.
'🛢 Database' 카테고리의 다른 글
[MySQL] 실행계획 (Execution Plan) - (2) type (0) | 2021.06.06 |
---|---|
[MySQL] 실행계획 (Execution Plan) - (1) id, select_type, table (0) | 2021.06.05 |
[MySQL] 인덱스 스캔 종류 (0) | 2021.06.05 |
[MySQL, Oracle] IS NULL, IS NOT NULL 조건은 인덱스를 사용할까? (0) | 2021.06.05 |
[MySQL] 1개의 테이블에 복수개의 인덱스 생성하기 (1) | 2020.06.18 |