아주 간단한 모델링을 하면서도, 여러 가지 고민을 했었다. 이게 맞는 걸까? 아니야 이게 맞는 걸꺼야 라는 생각을 여러번 했었다. 

 

매우 간단한 데이터베이스 모델링 사진이다.

 

 이런 간단한 테이블을 짜면서 고민했던 점은 아래와 같다.

 

1. Int와 INT UNSIGNED의 표현 범위는 똑같은데, PK에서만큼은 왜 INT UNSIGNED을 주로 쓸까?

2. 왜 컬럼 명을 camel case가 아닌 snake case로 사용하는 걸까?

3. 댓글과 댓글 본문의 길이 수에 차이를 둬야하는 데, 이 때 도메인 본문과 댓글 본문을 대등한 관계에 둬야하는 지, 아니면 댓글 본문을 본문의 자식 도메인으로 둬야하는 지

4. 댓글은 검색 기능을 구현할 생각이 없는데, TEXT나 LONGTEXT 등으로 사용해도 되지 않을까?

5. 수정일시 같은 경우는 수정이 발생할 때만 데이터를 얻을 수 있다. 또한 DATETIME같은 경우, default 값을 정하기 어렵다. 그렇다면 수정일시를 NULL 처리하는 것이 맞을까, 아니면 생성일시와 같이 NOT NULL로 처리하는 게 맞을까?

6. 댓글과 조회수도 이벤트가 발생해야, 데이터를 받을 수 있는데, NULL로 지정하면 안될까?

7. 비밀번호는 왜 CHAR 타입으로 선언해야할까?

8. 이 테이블이 1, 2, 3 정규형과 BCNF 정규형에 통과할 수 있을까?

9. 컬럼명은 대문자로 해야할까 소문자로 해야할까?


이러한 의구심이 들었고, 나는 이렇게 생각했다.

1. 

문제 없이 잘 작동은 된다.

물론 PK의 데이터 타입을 INT로 설정해, 음수가 나올 수도 있다. 전혀 문제 되지 않는다. 다만 편의성에서 문제가 생길 수 있다. 이 문제에 대해 나는 이런 가정을 상상했다.  오래되고, 사람들이 자주 이용하는 사이트의 데이터 베이스의 기본키가 INT로 되어있다면. INT의 표현 범위 65,535 중 절반만 사용할 수 있을 것이다. 주로 게시판은 시퀸스를 이용해 늘려나가니깐. 물론 음수로도 사용할 수 있다. 가정의 수는 이렇게 생각해봤다.

 1. -32768 부터 증가 -> 처음부터 숫자의 자리수가 크다. 

 2. 0부터 32767만큼 증가 후, -32768에서 증가 

 3. 32767에서 -32768로 감소

  이 외에도 여러 가지 경우의 수를 생각해봤는데, INT로 표현한다 해서 얻을만한 장점은 크지 않다고 생각한다. 무엇보다 INT UNSIGNED를 데이터 타입으로 둔다면 일관적이다.

 

2.  이 부분은 굉장히 의구심이 든다. JAVA에서는 camel case를 주로 사용하는데 db에서는 snake_case를 주로 사용해, jdbc를 사용할 때 문제가 발생할 수 있다. 왜 통일을 안하는 지 너무 궁금하다.

 

3, 이 부분은 아직까지도 고민 중이다. 그 이유는 자식 도메인이라는 개념을 구체적으로 알지 못해서인데, 그냥 도메인이든 자식 도메인이든 이 둘의 차이점을 느끼지 못했다. 다만 나는 본문의 하위 도메인으로 댓글본문을 추가했다.

 

4.  생각해보면 TEXT로 지정해둬도 나쁠 것 같지 않다고 생각한다. TEXT와 char의 차이점은 TEXT 필드는 기본 값을 가질 수 없으며,  MySQL은 TEXT 열의 처음 n개의 문자만 인덱싱 할 수 있다는 점인데.  댓글은 기본값을 가질 필요가 없으며, 댓글 안의 단어들을 검색할 것이 아니니, 검색 기능이 없는 부분에서 만큼은 취향 차이라고 생각한다.

5. 내 생각은 이렇다

  • 처음 insert될 시, 수정일시를 넣을 필요는 없음
  • 수정이 끝난 후, 그때서야 값을 받을 수 있음.
  • default값을 줄 수 없기에, 비어있음 그러므로 수정일시는 not null이 되어야한다고 생각한다.

 6.  위의 문제와 연관되어 고민해봤는데, INT 타입은 default를 지정해줄 수 있으며, 0으로 기본값을 지정해준다면 NOT NULL을 지정할 수 있다.

 

 7.  비밀번호의 보안을 위해, 해시 함수를 사용한다. 주로 사용되는 것은 SHA 계열의 해시 함수인데, 해시 함수는 고정된 길이의 숫자와 문자의 조합으로 반환된다. 내가 SHA-256을 사용한다면 64만큼의 문자열로 반환하니. 고정길이인 CHAR 타입으로 받는 것이 좋다고 생각한다.

 

 8. 1 정규형인 중복 애트리뷰트가 없으므로 통과, 기본키가 일반 애트리뷰트에 대해 이행 함수 종속성 없으며 반대로 일반 애트리뷰트가 기본키에 대해 이행 함수 종속성을 띄지 않으니 2, 3 정규형도 통과이다. 마지막으로 일반 애트리뷰트가 기본키에 대해 영향을 주지 않으니 BCNF도 통과했다고 생각한다. 

 

 9. 이 부분은 정말 모르겠다. 국내에서는 컬럼명을 대문자로 쓰는 추세지만 해외에서는 소문자도 많이 쓰인다고 봤다. 정말 취향에 관한 부분인 것 같다.

+ Recent posts