TIL 38. 데이터베이스와 정규화 (스타벅스 모델링)

rahula·2021년 6월 14일
0

web

목록 보기
3/3

데이터베이스와 정규화의 기초에 대해 공부한 것을 기록합니다. 이 글은 위코드 강의와 oracle, geeks for geeks, tcpschool, 3months을 토대로 쓰여졌습니다.

데이터란?

데이터란 수, 이미지, 영상 등의 형태로 된 의미단위이다. 상품정보, 유저정보 등등. 카카오톡을 예로들면, 각각의 톡방은 유저들의 데이터와 각각의 메시지 데이터, 시간 데이터 등으로 이루어져있다.

가공해서 사용하지 않는다면 데이터들은 의미를 갖지 못한다.

데이터들을 그저 나열하는 것보다, 나름의 기준을 갖고 구분하는 것이 훨씬 효율적이기 때문에, 데이터베이스의 효용성이 나오게 된다.

데이터베이스

데이터베이스란 일반적으로 컴퓨터 시스템에 전자 방식으로 저장된 구조화된 정보 또는 데이터의 체계적인 집합을 의미합니다. 데이터베이스는 보통 데이터베이스 관리 시스템(DBMS)에 의해 제어됩니다. 데이터와 DBMS는 연관된 어플리케이션들과 함께 '데이터베이스 시스템'으로 일컬어지며, 더 짧게는 '데이터베이스'라고 통칭되기도 합니다.

오늘날 운용되는 가장 공통적인 유형의 데이터베이스 내 데이터는 일반적으로 일련의 표 안에 행과 열로 모델링되며, 이는 프로세싱과 데이터 쿼리 작업을 더 효율적으로 실행하기 위함입니다. 이로써 데이터는 쉽게 액세스, 관리, 수정, 업데이트, 제어, 체계화될 수 있습니다. 대부분의 데이터베이스는 데이터 작성 및 쿼리 작업에 구조화 질의 언어(SQL)를 사용합니다.

Application에서는 데이터가 메모리 상에서 존재합니다. 메모리에 존재하는 데이터는 보존이 되지 않기 때문에 애플리케이션이 종료하면 메모리에 있던 데이터들은 다시 읽어 들일 수 없습니다. 따라서, 데이터를 오랜 기간 저장 및 보존 하기 위해서 데이터 베이스를 사용하는 것입니다.

관계형 데이터베이스

관계형 데이터베이스는 현재 가장 많이 사용되고 있는 데이터베이스의 한 종류입니다.
관계형 데이터베이스란 테이블(table)로 이루어져 있으며, 이 테이블은 키(key)와 값(value)의 관계를 나타냅니다.
이처럼 데이터의 종속성을 관계(relationship)로 표현하는 것이 관계형 데이터베이스의 특징입니다.

관계형 데이터베이스는(RDBMS) 관계형 데이터 모델에 기초룰 둔 데이터베이스 시스템.
1. 모든 데이터들은 2차원 테이블들로 표현할 수 있따. 행과 열로.
2. 테이블의 각 행은 자신만의 고유 키를 갖고 있따. 각 로우는 다른 로우와 겹치지 않는, 하나의 데이터만 정확하게 지칭할 수 있다. 고유 키를 통해 특정 로우를 찾거나, 인용할 수 있다.
3. 각각의 테이블들은 서로 상호 관련성을 갖고 서로 연결될 수 있다.

행과 열(column & row)

각각의 열은 유일한 이름을 가지고 있으며, 자신만의 타입을 가지고 있습니다.

이러한 열은 필드(field) 또는 속성(attribute)이라고도 불립니다.

행은 관계된 데이터의 묶음을 의미합니다.
한 테이블의 모든 행은 같은 수의 열을 가지고 있습니다.
이러한 행은 튜플(tuple) 또는 레코드(record)라고도 불립니다.

키와 값(key & value)

테이블은 각각의 행과 열에 대응하는 값을 가지고 있습니다.
이러한 값은 열의 타입에 맞는 값이어야 합니다.

테이블에서 행의 식별자로 이용되는 열을 키(key) 또는 기본 키(primary key)라고 합니다.
즉, 테이블에 저장된 레코드를 고유하게 식별하는 후보 키(candidate key) 중에서 데이터베이스 설계자가 지정한 속성을 의미합니다.

Primary Key

A primary key is used to ensure data in the specific column is unique. It is a column cannot have NULL values. It is either an existing table column or a column that is specifically generated by the database according to a defined sequence.

Foreign Key

A foreign key is a column or group of columns in a relational database table that provides a link between data in two tables. It is a column (or columns) that references a column (most often the primary key) of another table.

관계 유형

  1. 일대일 관계(One to One)
  2. 일대다 관계(One to Many)
  3. 다대다 관계(Many to Many) : 서로가 다른 테이블의 여러 데이터가 연결될 땐 두 테이블에 속한 데이터를 입력하기 위한 중간 테이블이 생성된다.

정규화

위와 같이 정규화가 되지 않은 구조의 테이블(Adam이라는 학생이 두 번 들어가 있습니다.)의 경우, 데이터 핸들링시 다양한 이상현상이 발생하게 됩니다.

  1. Update : Adam의 Address가 변경되었을 때, 여러줄의 데이터를 갱신해야합니다. 이로인해 데이터의 불일치(inconsistency)가 발생할 수 있습니다.
  2. Insert : 만약 학생이 아무 과목도 수강하지 않는다고 하면, Subject_opted 컬럼에는 NULL이 들어갈 것입니다.
  3. Deletion : 만약 Alex 학생이 과목 수강을 취소한다면 Alex의 레코드가 아예 테이블에서 지워져버립니다.

위와 같이 정규화가 제대로 되지 않은 테이블의 경우 갱신/삽입/삭제 시 다양한 문제점이 발생할 수 있습니다. 이를 테이블의 구성을 논리적으로 변경하여 해결하고자 하는 것이 바로 정규화입니다.

1. 1차 정규화

1차 정규형은 각 로우마다 컬럼의 값이 1개씩만 있어야 합니다. 이를 컬럼이 원자값(Atomic Value)를 갖는다고 합니다. 결과적으로 1차 정규화를 함으로써 데이터 redundancy는 더 증가하였습니다. 데이터의 논리적 구성을 위해 이 부분을 희생하는 것으로 볼 수 있습니다.

2. 2차 정규화

2차 정규화부터가 본격적인 정규화의 시작이라고 볼 수 있습니다. 2차 정규형은 테이블의 모든 컬럼이 완전 함수적 종속을 만족하는 것입니다. 이게 무슨 말이냐면 기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것입니다.

함수적 종속? (Functional Dependency)

함수적 종속이란 어떤 릴레이션 R이 있을때 X와 Y를 각각 속성의 부분집합이라고 가정해봅니다. 여기서 X의 값을 알면 Y의 값을 바로 식별할 수 있고, X의 값에 Y의 값이 달라질 때, Y는 X에 함수적 종속이라고 합니다. 이 경우 X를 결정자, Y를 종속자라고 합니다. 이를 기호로 표현하면 X→Y입니다. 이런 함수적 종속관계에는 완전 함수적 종속과 부분 함수적 종속 및 이행적 함수 종속이 있습니다.

3차 정규화

3차 정규형은 기본키를 제외한 속성들 간의 이행적 함수 종속이 없는 것 입니다. 풀어서 말하자면, 기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정할 수 없는 것입니다.

스타벅스 모델링

스타벅스 사이트에서 나열하는 모든 음료들의 데이터베이스 구조를 짜오라는 과제를 받았다. 처음 볼 땐 쉬워보였는데, 테이블 간의 관계 때문에 생각할 게 많았다.

1. 카테고리

모든 음료는 크게 카테고리 안에 묶여 있었다(종속성). 애초에 음료마다 카테고리를 적는다면 데이터 중복이 발생하게 된다. 따라서 1차 정규화와 2차 정규화에 의해서 카테고리를 음료로부터 분리해서 다른 테이블로 만들었다.

2. 영양정보

3차정규화에 의해서 영양정보는 따로 분리한다.

3. 기타

중복이 발생하지 않는다면 테이블은 굳이 필요한가 싶어서, 상세설명이나 영어이름 등의 데이터는 음료 테이블에 다 넣었다.

4. 알러지

예상치 못하게 어려웠던 부분이 알러지였다. 원래는 일대다 관계라고 생각했는데, 자세히 음료들을 보니 한 음료에서 여러가지 알러지 성분을 갖고 있는 경우가 있었다. 즉, 다대다 관계를 만들어야 했다.

(조원 지우님, 현정님, 지수님, 종민님, 소미님 감사합니다.)

추가 궁금증

one to one관계에 대해

one to one 관계는 상황에 따라 테이블을 합칠 수 있다. 자주 쓰이는 데이터라면, 하나의 테이블에 모두 있는게 훨씬 효율적이다. 반대로 테이블을 조인해서 가져오게 되면 SQL문이 복잡해지고 느려진다.

화살표 방향은 어디로 향하든 상관없지만, 왠만하면 단방향인 것이 좋다. 관계형 DB에서는 단방향을 쓰는 것이 최선이라고 한다. 서로가 서로의 부모가 되면 나중에 DB를 확장할 때 문제가 생길 수 있다.

중간 테이블에 대해

  1. 중간 테이블은 필수적이다. 다대다 관계는 중간 테이블 없이는 표현할 수 없다.
  2. 중간 테이블은 이어주는 역할 이외에도 추가적인 데이터를 덧붙일 수 있다.

추가 질문

  1. 함수종속도 완전 함수 종속, 부분 함수 종속, 이행 함수종속으로 나뉜다고 한다. 뭘까?
  2. 정규화가 실무에서 쓰이는 사례가 궁금하다. 정규화를 했냐 안했냐에 따라 데이터베이스가 어떤 영향을 받는지를 알아보고 싶다.
  3. 데이터가 참 혹은 거짓의 형태를 띈다고 할 때 nullable속성을 쓰는게 좋을까 , 데이터를 boolean 타입으로 지정하는게 좋을까?
profile
백엔드 지망 대학생

0개의 댓글