[DB] erd와 정규화

데이터베이스란?

엑셀이라고 생각하면 편함! 데이터는 엑셀처럼 저장이 된다. (2차원)

개발자와 데이터베이스 간에 소통할 수 있는 언어, SQL(Structured Query Language)

ANSI SQL

표준 SQL 문법을 의미

Database Cheat Sheet

빠른 SQL을 검색할 수 있게 해주는 사이트

ID가 필요한 이유

고유한 데이터를 key라고 하고, 이 key의 경우 다른 테이블과 연결을 지을 수 있다. 이것을 외래키라고 한다. (다른 테이블의 key를 가져오는 것이기 때문에)

다른 테이블과 연동이 되어있는 key 값(외래키)이 변경되었을 때, 이 연동성이 꺠질 위험이 있다. 그래서 이런 부분을 예방하기 위해 처음부터 잘 고려해서 절대 바뀔 일이 없는 key 값으로 설정하도록 한다. 보통 이런 key 값을 ID로 설정하게 된다.

즉, 변동이 가능한 데이터거나 동일한 값이 있는 데이터와 구별되는, 영구적으로 바뀔 일이 없는 한 row의 데이터를 대변할 수 있는 고유의 데이터가 있어야함. 이것이 ID가 된다.

각각의 ROW를 구별해주고, 바뀔 여지가 없는 데이터인 ID를 기본키라고 한다. 이 기본키를 다른 테이블에서 참고해서 데이터를 꺼내올 수 있는데 사용하는 경우 이것은 외래키라고 한다.

컬럼 두 개를 모두 key로 사용할 수도 있는데, 이것을 복합키라고 한다. 그런데 두 데이터 중 하나가 바뀔 여지가 있는 경우가 있기때문에 잘 쓰이지는 않는다.

ID를 연속숫자로 하는 경우 장단점

  • uuid
  • shortid
  • nanoid

ID를 연속된 숫자로 하지 않고 겹치지않는 위 라이브러리들을 활용하여 랜덤한 ID로 설정하는 경우가 많다.

데이터베이스 내의 ID를 활용해서 데이터의 정보를 알아낼 수가 있다. 그런 ID를 활용하여 어떤 데이터가 알려지는게 괜찮다면(공개 데이터의 경우) 상관없지만, 이가 문제가 되는 데이터의 경우 연속된 숫자로 하지 않고 랜덤한 ID로 지정하는 것이 좋다.

1:1, 1:n, m:n

테이블 간의 관계는 기본키와 외래키로 엮여있다.

서로 관계를 가지고 있는 데이터의 경우 1:1, 1:n, m:n으로 관계를 가질 수가 있다.

ex) 사원과 전화번호는 1:1?

ERD

entity relationship diagram

테이블 간의 관계를 잘 나타내어 보여주는 다이어그램

다대다 관계

중간 테이블을 필연적으로 만들어야한다. 다대다 관계인 아이들의 id로(외래키) 서로를 연결시켜줄 중간 테이블이 있어야한다.

데이터를 저장해놓고 나중에 간단하게 데이터를 불러오는 것이 가능하다. 중간테이블의 이름은 다대다 관계인 각각 테이블을 합친 이름이 된다.

soft delete vs hard delete

상황에 따라서 데이터를 지우면 안되는 경우가 있다. 외래키로 연결되어있는 데이터가 실수로 지워져 특정 테이블에만 남아있게 되는 경우도 있다.

보통 직접적인 삭제보단, 간접적인 삭제를 하게 되는데, 이것을 soft delete라고 한다. 주로 삭제일이라는 컬럼을 추가하여 간접적으로 삭제했음을 삭제일을 기재하여 나타낸다.

완전히 데이터를 삭제하는 것을 hard delete라고 한다. 나중에 정보가 필요할지 필요없을지를 판단하여 직접적인 데이터 삭제나 간접적인 데이터 삭제를 하도록 선택할 수 있다.

정규화

제 2정규화

어떤 테이블에 추가로 컬럼을 넣을 수 있다. 그런데 특정 컬럼이 중복되어 같은 데이터가 생성되고, 해당 데이터가 바뀔때 다른 데이터도 다 같이 바꿔주는 상황의 경우, 정규형이 위반이 되는 경우가 많다.

정규형이 위반이 되는 경우일 때, 해당 컬럼이 어떤 복합키 중에 연관이 있는지 체크해보고, 연관성이 있는 테이블에 해당 컬럼을 옮겨서 정규형 위반이 되지 않도록 수정해준다.

즉, 어떤 테이블에 해당하는 컬럼이 테이블과 정말로 직접적인 데이터 정보에 해당하는지 맞아야할 것이고, 그 정규형에 위반되는 것을 구별할 줄 알아야한다.

제 3정규화

사원 테이블에 최저연봉 컬럼을 추가하였을 때, 최저연봉은 역할이라는 컬럼에 따라서 나뉘어지게 된다. 그러면 사원 테이블에 대한 최저연봉이 정해지는 것이 아니라, 역할 컬럼에 따라서 나뉘어지기 때문에 3정규형 위반이 되게된다.

그래서 이런 경우 역할 테이블을 하나 추가하여 최저연봉 컬럼을 역할에 따라 나뉘어지도록 분리하여 외래키로 데이터를 가져오게끔 수정하여 정규화 위반이 되지않도록 한다.

그렇지만 컬럼이 단순히 데이터 중복 때문에 분리하지는 않고, 연관된 데이터 컬럼이 두 개 이상 있을 때 새로운 테이블로 분리하는 경우가 대부분이다.

역정규화

개발의 편의로 정규화했던 컬럼을 다시 되돌리는 것을 말한다.

테이블 구조를 어떠한 성능상의 이슈 등으로 바꾸게 되거나하게되면 필요에 따라서 역정규화도 하게되는 일이 발생할 수 있다.