[DBMS] 데이터베이스 모델링

류재성's avatar
Nov 09, 2024
[DBMS] 데이터베이스 모델링
 

1. 데이터베이스 모델링 개념

 
💡
데이터베이스 모델링은 현 세계에서 사용되는 작업이나 사물들을 DBMS의 데이터베이스 개체로 옮기기 위한 과정이다. 쉽게 얘기하면 현실에서 쓰이는 것을 테이블로 변경하기 위한 작업이라고 생각하면 된다.
 
notion image
 
그림과 같이 현실 세계에서의 고객, 물건, 직원 등은 데이터베이스에서 각각의 테이블이라는 개체로 변환된다.
 
💡
주의할 점은 현실 세계의 실체가 없는 ‘물건을 산다’ 라는 행위도 테이블로 변환된다는 점이다.
 

2. 모델링 예제

 

2.1 쇼핑몰 방문 내역

 
고객 방문 테이블
고객 이름
출생년도
주소
연락처
구매한 물건
단가
수량
이승기
1987
서울
011-111-1111
김범수
1979
경남
011-222-2222
운동화
30
2
김범수
1979
경남
011-222-2222
노트북
1000
1
김경호
1971
전남
019-333-3333
조용필
1950
경기
011-444-4444
모니터
200
1
바비킴
1973
서울
010-000-0000
모니터
200
5
윤종신
1969
경남
없음
김범수
1979
경남
011-222-2222
청바지
50
3
임재범
1963
서울
016-666-6666
바비킴
1973
서울
010-000-0000
메모리
80
10
성시경
1979
경남
없음
15
5
은지원
1978
경북
011-888-8888
15
2
임재범
1963
서울
016-666-6666
은지원
1978
경북
011-888-8888
청바지
50
1
바비킴
1973
서울
010-000-0000
운동화
30
2
은지원
1978
경북
011-888-8888
은지원
1978
경북
011-888-8888
15
1
바비킴
1973
서울
010-000-0000
운동화
30
2
조관우
1965
경기
018-999-9999
 
고객의 방문은 위의 표와 같이 기록된다. 고객은 여러번 방문할 수도 있고, 아무것도 사지 않고 갈 수도 있다.
 

2.2 방문기록 정렬

 
표에서 구매한 이력이 없는 행을 위쪽으로 정렬해본다.
 
고객 이름
출생년도
주소
연락처
구매한 물건
단가
수량
이승기
1987
서울
011-111-1111
김경호
1971
전남
019-333-3333
윤종신
1969
경남
없음
임재범
1963
서울
016-666-6666
임재범
1963
서울
016-666-6666
은지원
1978
경북
011-888-8888
조관우
1965
경기
018-999-9999
김범수
1979
경남
011-222-2222
운동화
30
2
김범수
1979
경남
011-222-2222
노트북
1000
1
조용필
1950
경기
011-444-4444
모니터
200
1
바비킴
1973
서울
010-000-0000
모니터
200
5
김범수
1979
경남
011-222-2222
청바지
50
3
바비킴
1973
서울
010-000-0000
메모리
80
10
성시경
1979
경남
없음
15
5
은지원
1978
경북
011-888-8888
15
2
은지원
1978
경북
011-888-8888
청바지
50
1
바비킴
1973
서울
010-000-0000
운동화
30
2
은지원
1978
경북
011-888-8888
15
1
바비킴
1973
서울
010-000-0000
운동화
30
2
 
이렇게 정렬하면 전체 테이블이 L 자 모양의 테이블이 되었다. 이것을 L자형 테이블이라고 부른다.
L자형 테이블의 문제는 공간 낭비에 있다.
 

2.3 테이블 분리

 
L자형 테이블을 빈 칸이 있는 곳과 없는 곳으로 분리해보자. 그러면 다음 표와 같이 고객 방문 테이블이 고객 테이블과 구매 테이블로 분리가 된다.
 
고객 테이블
고객 이름
출생년도
주소
연락처
이승기
1987
서울
011-111-1111
김경호
1971
전남
019-333-3333
윤종신
1969
경남
없음
임재범
1963
서울
016-666-6666
임재범
1963
서울
016-666-6666
은지원
1978
경북
011-888-8888
조관우
1965
경기
018-999-9999
김범수
1979
경남
011-222-2222
김범수
1979
경남
011-222-2222
조용필
1950
경기
011-444-4444
바비킴
1973
서울
010-000-0000
김범수
1979
경남
011-222-2222
바비킴
1973
서울
010-000-0000
성시경
1979
경남
없음
은지원
1978
경북
011-888-8888
은지원
1978
경북
011-888-8888
바비킴
1973
서울
010-000-0000
은지원
1978
경북
011-888-8888
바비킴
1973
서울
010-000-0000
구매 테이블
구매한 물건
단가
수량
운동화
30
2
노트북
1000
1
모니터
200
1
모니터
200
5
청바지
50
3
메모리
80
10
15
5
15
2
청바지
50
1
운동화
30
2
15
1
운동화
30
2
 
테이블을 분리하면 빈 공간이 사라져 공간을 절약할 수 있다.
하지만 분리한 테이블은 2가지 문제가 있다. 하나는 고객의 정보가 중복되어 있다는 점이다. 다른 하나는 구매 테이블만 보면 누가 제품을 구매했는지 알 수가 없다. 이 두가지 문제를 해결해야 한다.
 

2.4 고객 테이블 중복 제거 (기본키 설정)

 
고객 테이블
고객 이름(PK)
출생년도
주소
연락처
이승기
1987
서울
011-111-1111
김경호
1971
전남
019-333-3333
윤종신
1969
경남
없음
임재범
1963
서울
016-666-6666
은지원
1978
경북
011-888-8888
조관우
1965
경기
018-999-9999
김범수
1979
경남
011-222-2222
조용필
1950
경기
011-444-4444
바비킴
1973
서울
010-000-0000
성시경
1979
경남
없음
 
고객 테이블의 중복을 제거했다. 고객 테이블에서 고객 이름은 기본키라고 한다.
 
💡
기본키(Primary Key)는 테이블에서 각 행을 고유하게 식별하는데 사용되는 컬럼이다. 기본키는 각 행을 식별하는 값이기 때문에 반드시 존재해야 한다.
 

2.5 구매 테이블 고객 이름 추가(외래키 설정)

 
고객 테이블과 구매 테이블을 연관시키기 위한 식별자가 필요하다. 두 테이블은 고객명을 통해 연결할 수 있다. 구매 테이블과 고객 테이블을 연결하기 위해 구매 테이블에 고객명을 넣는다.
 
구매 테이블
고객 이름(FK)
구매한 물건
단가
수량
김범수
운동화
30
2
김범수
노트북
1000
1
조용필
모니터
200
1
바비킴
모니터
200
5
김범수
청바지
50
3
바비킴
메모리
80
10
성시경
15
5
은지원
15
2
은지원
청바지
50
1
바비킴
운동화
30
2
은지원
15
1
바비킴
운동화
30
2
 
구매 테이블에 고객 이름을 넣어 누가 어떤 제품을 구매했는지 알 수 있게 되었다.
 
💡
구매 테이블은 고객 테이블처럼 중복되었다고 행을 삭제하면 안된다. 고객 테이블에서 고객이름은 각 행을 구분하는 기본키였지만 구매 테이블에서는 고객 테이블과 연관짓기 위한 컬럼이기 때문에 각 행을 식별하는 컬럼이 아니기 때문이다. 이런 경우 고객 이름은 외래키(Foreign Key) 라고 부른다. 외래키는 다른 테이블의 기본키를 참조해서 두 테이블간의 관계를 형성할 때 사용한다.
 

2.5 테이블간 관계(Relation)

 
💡
고객 테이블과 구매 테이블은 밀접한 관련이 있는 테이블이다. 즉, 그매 테이블만으로는 고객에세 배송할 수가 없다. 고객의 주소와 연락처는 고객 테이블에 있기 때문이다. 따라서 두 테이블의 업무적인 연관성을 맺어 줘야 한다. 이를 관계(Relation) 이라고 한다.
 
두 테이블 중엣 부모 테이블과 자식 테이블을 결정해보자. 부모와 자식을 구분하는 방법 중에서 주(Master)가 되는 쪽은 부모, 상세(Detail)가 되는 쪽을 자식으로 설정하는 방법이 있다.
 
그렇다면 고객과 구매 내역 중 어느 것이 주가 되는가?
 
“고객은 물건을 소유한다.” 또는 “물건은 고객을 소유한다.”
 
어느 것이 더 자연스러운가? 당연히 전자가 훨씬 자연스러운 표현이다. 그러므로 고객 테이블이 부모가 되고 구매 테이블이 자식 테이블이 된다.
 
또, 기준이 하나인 것과 하나의 기준이 여러 개의 기록을 남기는 것으로 나누어 부모 테이블과 자식 테이블을 구분할 수 있다.
 
“한 명의 고객은 여러 개의 구매 내역을 가질 수 있다.” , “하나의 구매 내역은 여러 고객이 가질 수 있다.“
 
역시 전자가 자연스럽다. 이런 관계를 1대 N 관계라고 한다.
 
💡
부모 테이블과 자식 테이블의 관계를 맺어주려면 기본키와 외래키를 설정한다. 1대N 의 관계에서 기본키는 1 , 외래키는 N 인 테이블로 설정한다. 고객 테이블에서 고객 이름을 찾으면 구매 테이블에서 구매 이력을 찾을 수 있다.
 

2.6 제약 조건 설정

 
이렇게 테이블간 관계가 설정된 후 제약 조건이라는 관계가 설정된다.
 
예를 들어 ‘존밴’ 이라는 사람이 모니터를 구매해야 한다고 가정해보자. 그러면 구매 테이블에는
‘존밴/모니터/200/1’ 이라는 행이 추가되어야 한다. 그런데 현재 ‘존밴’ 이라는 정보가 고객 테이블에 없기 때문에 구매 테이블에 행이 추가가 되면 안된다. 행이 추가되기 위해선 회원가입이 우선되어야 한다.
 
이처럼 테이블간 데이터의 무결성을 지키기 위해 사용되는 것이 제약 조건이다. 기본키(PK)와 외래키(FK) 도 제약조건의 일종이다.
 

3. SQL Server로 모델링 실습

 
notion image
 
데이터베이스 - 마우스 우클릭 - 새 데이터베이스를 선택한다.
 
notion image
 
ModelDB 라는 데이터베이스를 생성한다.
 
notion image
 
데이터베이스 - ModelDB - 마우스 우클릭 - 새 데이터베이스 다이어그램을 선택한다.
 
“지원 개체를 만들겠습니까?” 라는 메세지 박스가 뜨면 예를 선택한다.
 
그 다음 뜨는 테이블 추가 창은 닫기를 선택한다.
 
notion image
 
그리고 뜨는 새 쿼리창에서 마우스 우클릭 - 새 테이블을 선택한다.
 
 
notion image
 
테이블 명을 고객테이블로 설정한다.
 
notion image
 
테이블의 컬럼을 넣는다.
 
notion image
 
고객이름에 마우스 우클릭 - 기본키 설정을 선택한다.
 
notion image
 
동일하게 구매 테이블을 생성한다.
 
notion image
위의 사진처럼 구매 테이블의 고객 이름 컬럼을 선태 후 마우스 드래그로 고객 테이블의 고객이름 컬럼에 연결한다.
 
notion image
 
연결하면 사진과 같은 팝업이 뜬다. 테이블간 관계 이름을 설정 후 확인을 누른다.
 
notion image
관계가 형성되면 위의 사진과 같이 연결된다.
 
notion image
 
왼쪽 상단의 모두 저장을 누르면 데이터베이스 설정이 저장된다.
 
notion image
 
고객 테이블과 구매 테이블이 생성된 것을 확인할 수 있다.
 

4. 기존 테이블의 관계도 만들기

 

4.1 사용자 변경하기

 
 
샘플로 다운받은 AdventureWorks 를 사용해 다이어그램을 만들어보자.
 
만들기 전 소유자를 변경해야 한다.
 
notion image
 
데이터베이스 - AdventureWorks2022 마우스 우클릭 - 속성을 선택한다.
 
notion image
 
데이터베이스 속성 - 파일 - 소유자 더보기(…) 클릭 - 찾아보기 를 선택한다.
 
notion image
 
개체 찾아보기에서 소유자를 ‘NT AUTHORITY\SYSTEM’ 을 선택한다.
 
notion image
 
소유자가 바꾼 후 확인을 누른다.
 
💡
NT AUTHORITY\SYSTEM 는 윈도우의 ROOT 계정과 유사하며, 시스템 내부 작업 및 서비스를 수행할 수 있는 권한을 가진다.
 

4.2 다이어그램 만들기

 
notion image
 
데이터베이스 - AdventureWorks2022 마우스 우클릭 - 새 데이터베이스 다이어그램을 선택한다.
 
notion image
 
기존 테이블들이 뜬다. 이 중 몇개를 선택한 후 추가를 누른다.
 
notion image
 
그럼 자동으로 테이블의 관계도를 볼 수 있다.
 
 
Share article

{CODE-RYU};