TIL - ERD와 내가 몰랐던 소소한 규칙들

solee·2022년 2월 9일
0

TIL

목록 보기
2/20

ER 다이어그램을 써본 적 있냐면, 있다. 그냥 보기만 한 것도 정보처리기사 공부를 할 때에도 많이 봤고, 스프링 프로젝트를 진행하면서도 ppt를 위해 만들었다. SQL도 사용하면서 PK니 FK니 많이 써 봤다고 생각했는데 막상 각 잡고 만들어 보니 많이 모르고 있었다.
한번 모델링을 해 보았는데, 생각보다 부족한 부분이 많았다.

내가 잘 몰랐던 ERD의 규칙들에 대해 정리해서 적어보고자 한다.



명명 규칙

프로그래머들이 시간을 많이 들이는 작업 중 하나가 바로 변수명 등 이름을 짓는 것이라고들 한다.

당연한 말이지만 프로그램을 개발할 때에는 다른 개발자와 협업을 하게 된다. 내가 변수명을 a라고 지으면 나는 그 변수가 클라이언트가 입력한 이름을 저장한 변수라는 걸 알지만 다른 개발자는 알 수가 없다. 반대로 다른 개발자가 b라는 함수를 만들어 두었다면 나는 그 함수가 어떤 기능을 가지고 있는지 알 수 없다. 그러므로 개발자가 무엇인가를 명명할 때에는 누구나 한눈에 알아볼 수 있도록 짓는 것이 중요하다.



  • 테이블명은 직관적으로 지어야 한다.

보자마자 이게 무슨 테이블인지 바로 알아낼 수 있을 만큼 직관적인 게 좋다. 한 쇼핑몰이 옷, 신발, 모자, 컵, 식품을 판매할 때, 옷 테이블의 이름을 items라고 지으면 크나큰 혼란이 일어날 것이다.



  • 데이터는 정확해야 한다.

당연한 소리기도 하지만, 예를 들어 과학적인 숫자들은 정수가 나오기 어려운데, 무심코 숫자니 float가 아닌 int로 자료형을 설정하는 대형사고를 칠 수 있겠다.
또 정규화를 통해 데이터의 무결성을 해치지 않도록, 정확한 데이터가 DB에 잘 보존되게 할 수 있어야겠지.



  • camel case와 snake case

카멜 케이스란 변수 이름을 짓는 규칙 중 하나로, 다른 단어를 합칠 때 모든 단어를 붙여 쓰되 띄어쓰기 대신 각 단어의 첫번째 문자를 대문자로 쓰는 규칙이다. 나는 자바를 먼저 배우기도 해서 항상 카멜 케이스를 사용해 변수명을 wholeDiv나 loginSpan같은 것으로 짓곤 했는데, DB나 API에서는 snake case를 많이 사용한다고 한다. snake case란 띄어쓰기 자리에 _언더바(언더스코어)를 사용하는 것으로 모든 문자는 소문자만 사용한다. 예를 들어 보자면 first_name_div 정도로 쓸 수 있을 것이다.
아무래도 버릇이 든 거라 고치기가 쉽지 않을 것 같다. 매번 신경써서 쓰다 보면 이것도 버릇이 될 수 있겠지.

그리고 또 한 번 snake case를 사용했다면 테이블명과 변수명을 전부 통일해 사용해주어야 한다. 이런 convention을 통일하도록 하자.



  • 약어는 지양해야 한다.

내가 만약 학생과 학부모, 교사에 대한 데이터를 다루는 모델링을 한다고 생각해 보자. 나는 학생들의 특이사항을 students 테이블에 spe_info라는 컬럼명을 주기로 결정했다. special_information을 줄인 것인데, 이것만 봐서는 다른 개발자가 이 컬럼이 정확히 어떤 데이터를 가지고 있는지 알 길이 없다. 널리 사용된다고 생각하는 수많은 약어들도 마찬가지다. 그러므로 컬럼명을 지을 때에는 약어를 지양하고 명명해야 한다.



  • 테이블명과 컬럼명은 단,복수를 잘 지켜야 한다.

카페의 판매 관련 데이터를 모델링할 때, 모든 상품을 한 테이블에 넣을 것이 아니라면 drink와 bakery 등을 분리해야 할 것이다. 이때, drink가 아니라 drinks를 사용하는 게 좀 더 적절할 것이다. 이 테이블에는 다양한 음료들의 정보가 저장될 것이기 때문이다.
그러면 컬럼명은 어떻게 해야 할까? 예를 들면 음료의 이름들이 저장될 것이니 names라고 지으면 될까?
아니다. DBMS에서 데이터들은 각 레코드가 한 행에 출력된다. 테이블로 표현해 보자면 다음과 같을 것이다.


id이름가격아이스
1아메리카노4,000False

id가 1인 음료의 "이름"은 아메리카노고, "가격"은 4,000원이다. 그리고 아이스가 False이니 뜨거운 음료다. 만약 컬럼명을 복수로 설정한다면 어떻게 될까?


id이름들가격들아이스
1아메리카노4,000False

이름"들"이 아니다. 한 레코드의 속성이므로 컬럼명은 단수여야 할 것이다.
그러므로 이 테이블을 다이어그램으로 올바르게 표현하면 아래처럼 된다.

테이블명은 복수로, 컬럼명은 단수로.



  • 메인 테이블은 다이어그램 중간에 놓는 것이 좋다.

다양한 테이블들이 중요한 테이블, 즉 메인 테이블에 연결되므로 가운데에 놓아 다른 테이블들이 메인 테이블과 어떻게 연결되는지를 직관적으로 볼 수 있는 것이 좋다.





여기서부터는 자잘한 이야기다.

이미지같은 경우는 이미지 자체를 DB에 저장하는 것이 아니라 클라우드에서 URL을 사용하는 경우가 만으므로 타입을 설정할 때 유의한다.

각 테이블의 id(PK)를 다른 테이블이 참조할 때, members 테이블의 id였다면 컬럼명을 member_id라고 짓는다. 또 외래키는 테이블 가장 아래로 가도록 한다.

bool이 True와 False로 구분되는데, 이와 비슷하게 tinyint가 있다. 0 혹은 1로 결과가 나온다. bool을 사용할 때에는 변수나 컬럼명을 is_new나 is_enough처럼 의문문으로 작명한다.

여러 테이블에 같은 컬럼명이 있을 수 있다(ex.회원 테이블의 name 컬럼과 직원 테이블의 name 컬럼). 이때 컬럼에 접근할 때 회원.name이나 직원.name을 사용하므로 컬럼명 자체를 member_name이나 worker_name으로 짓지 않는다. members.member_name처럼 번거롭고 중복된다.


profile
DA DA DA

0개의 댓글