본문 바로가기
데이터 모델과 SQL

[데이터 모델과 SQL] 4. 좋은 테이블이란?

by 영바이트 2022. 12. 28.

 

이전 포스팅까지 SQL의 기본적인 SELECT 명령과 SELECT 명령의 결과를 대상으로 추가적인 계산을 하거나 문자열 등을 덧붙이는 표현식(expression)에 대해 알아보았다. 데이터베이스의 내용을 조회하는 SELECT 명령에 대해 좀 더 들어가기 전에 SELECT 쿼리의 대상인 테이블에 대해 생각해 보는 시간을 갖고자 한다.

 

한 가지 질문을 해 보자.

Q. 좋은 구조의 데이터베이스(=테이블들의 집합)를 갖는 것은 왜 중요한가?

 

위 질문은 현재 우리가 살펴보고 있는 SELECT 쿼리와도 관련이 있다. 여러 이유가 있겠지만 무엇보다, 

A. 원하는 데이터를 간단한 쿼리로 짧은 시간 안에 찾을 수 있기 때문이다.

 

 

● 테이블 생성하기

테이블을 생성하기 전에 반드시 생각해 보아야 할 항목들을 정리해보자.

 

· 하나의 테이블은 하나의 주제만 다룬다. 둘 이상의 주제가 되면 테이블을 나눈다.
· 테이블 이름은 중의적(multiple meaning)이면 안된다.
예) employeerecord X → employeedepartment, employeeemployees, employeepayroll
· 테이블 이름으로 약자를 사용하지 마라. 다른 사람들이, 또 나중에 내가 테이블의 내용을 인지하기 힘들다.
· 테이블 이름은 일반적으로 복수형(예, employees)을 사용하는 것이 좋다. 왜냐하면 테이블은 다양한 속성들을 가진 객체들의 집합이기 때문이다.

 

그러면 좋은 구조의 테이블이란 어떤 테이블인지 알아보자.

 

 

● 좋은 구조의 테이블

좋은 구조의 테이블은 아래 조건들을 충족시켜야 한다.

 

· 하나의 테이블은 하나의 주제(subject)만 다룬다. 여기서 주제란 객체(object, 예: employees, machines)와 같은 물리적인 실체나 사건(event, 예: doctor's appointment)과 같이 세부 속성으로 이루어진 한 시점의 사건 중 하나이다.
· 테이블은 반드시 키(primary key)를 가져야 한다. 키: 테이블 안의 각 데이터를 유일하게 식별할 수 있는 식별자.
· 테이블 안에는 multipart, mutivalue 컬럼이 없어야 한다.

○ multipart 컬럼: 여러 속성의 데이터가 복합되어 있는 컬럼. 예) 주소(=도+시+구+거리)
→ multipart 컬럼은 그 값이 토큰(token: 더 이상 쪼개지지 않는 정보)으로 될 때 까지 분해한다.

○ mutivalue 컬럼: 속성은 하나지만 값이 여러 개 일 수 있는 컬럼. 예) 자격증 번호(지게차 면허, 비행기 조종 면허, 정비사 면허 등)
→ mutivalue 컬럼은 다른 테이블로 분리하고 연결 테이블(linking table)을 활용하여 연결한다. 예) 자격증 컬럼 - 직원의 자격증 소지 정보 테이블 - 자격증 정보 테이블· 중복 컬럼 문제: 여러 테이블에 같은 정보를 저장하면 안된다. 나중에 어떤 테이블의 정보가 옳은 것인지 알 수 없게 되는 일관성 문제가 발생한다.

· 데이터베이스에 계산 결과를 저장하는 것은 좋지 않다. 데이터가 바뀌면 계산 결과는 틀린 값이 되기 때문이다.


일차적인 정보는 데이터베이스의 테이블 안에 보관된다. 하지만 데이터의 다양한 측면들 즉, 2차 이상의 정보는 테이블들 사이의 연결에서 나온다. 테이블 사이의 관계에 대해 알아보자.

 

● 테이블 사이의 관계

테이블 사이의 관계는 아래 3가지로 나뉜다.

· 1:1(one to one) - 예, 고객 정보-담당 매니저
· 1:다(one to many): 예, 고객 정보-주문 정보
· 다:다(many to many): 예, 주문 정보 - 상품 정보

 

테이블 사이에 서로를 참조 할 때 기준이 되는 테이블을 주 테이블(primary table, 예: 고객 정보)이라고 하고 참조가 되는 테이블을 부 테이블(subordinate table, 예: 주문 정보)이라고 한다. 주 테이블과 부 테이블은 데이터의 어느 측면을 보는가에 따라 달라진다.

테이블 사이의 관계는 나중에 살펴볼 데이터 삭제, 그리고 테이블 연결(joining table)을 위해 중요하다.

 

 

● 데이터 삭제와 테이블

데이터베이스에서 거의 모든 경우 테이블들은 서로 연결되어 있다. 따라서 테이블 혹은 테이블의 데이터가 삭제되면 연결된 테이블이 고아 테이블(orphaned table)이 되거나 연결된 테이블의 데이터가 고아 행(orphaned row)이 될 수 있다. 테이블 혹은 데이터를 삭제할 때는 고아 테이블 또는 고아 행이 생기지 않도록 아래 두 가지 규칙 중 하나를 준수하여야 한다.

 

ⓐ Restrict Deletion rule(R 규칙, 삭제 제한): 만약 다른 테이블에 삭제 대상과 연결된 데이터가 존재한다면 삭제 대상 데이터를 삭제 할 수 없다.

 

ⓑ Cascade Deletion rule(C 규칙, 연관 삭제): 데이터를 삭제할 때 삭제 대상 데이터와 연결된 데이터들을 모두 삭제한다.

 

데이터 삭제와 테이블 사이의 관계를 함께 생각해보자.

 

- 1:1 관계에 있는 테이블들에서 데이터를 삭제할 때는 관련 테이블 모두에서 데이터를 삭제해야 한다.

 

- 1:다 관계에 있는 테이블들에서 데이터를 삭제할 때는 아래 두 경우를 구분하여 따른다.

· 주 테이블의 데이터 삭제: 부 테이블의 연관되는 데이터들도 모두 삭제한다.

· 부 테이블의 데이터 삭제: 부 테이블의 데이터만 삭제한다(주 테이블은 건들지 않는다).

 

- 다:다 관계에 있는 테이블들에서 데이터를 삭제할 때도 어떤 테이블이 주 테이블이고 또 어떤 테이블이 부 테이블인가에 따라 다른 기준이 적용된다.

· 주 테이블의 데이터 삭제: 부 테이블의 연관되는 데이터들도 모두 삭제한다. 두 테이블을 연결하는 연결 테이블을 사용한다면 연결 테이블 정보만 삭제한다. 예) 직원 - 직원 별 소지 자격증 - 자격증, 직원이 퇴사하면 직원 별 소지 자격증 정보(연결 테이블 정보)만 삭제한다.

· 부 테이블의 데이터 삭제: 부 테이블의 데이터만 삭제한다(주 테이블은 건들지 않는다).

 

 

댓글