논리적 데이터 모델의 개념과 특성
선택한 DBMS에 따라 사용자 입장에서 E-R 다이어그램으로 표현된 개념적 구조를 데이터베이스에 저장할 형태로 표현한 논리적인 구조를 논리적 데이터 모델이라고 한다. 즉, 논리적 데이터 모델은 논리적 데이터 모델링의 결과물이고, 사용자가 생각하는 데이터베이스의 모습 도는 구조이다. 그리고 논리적 데이터 모델로 표현된 데이터베이스의 논리적 구조가 바로 데이터베이스 스키마이다. 데이터베이스에 있는 데이터 간의 관계를 표현하는 방법에 따라 다양한 논리적 데이터 모델이 존재한다. 일반적으로 누구나 쉽게 이해할 수 있는 데이터 구조를 가지고, 데이터의 검색, 삽입, 삭제, 수정 등의 연산을 제공하는 논리적 데이터 모델이 관계 데이터 모델이다.
데이터베이스 설계 개념
관계 데이터 모델을 기반으로 두고 데이터베이스를 설계할 때는 'E-R 모델과 릴레이션 변환 규칙을 이용한 데이터베이스 설계'와 '정규화를 이용한 데이터베이스 설계' 두 가지 방법을 주로 사용한다.
1단계 : 요구사항 분석
이 단계에서는 조직의 구성원들이 데이터베이스를 사용하는 용도를 파악한다. 수집한 요구 사항을 분석하여 그 결과를 요구 사항 명세서로 작성하는 것이 요구 사항 분석 단계에서 수행하는 주요 작업이다.
2단계 : 개념적 설계
요구 사항 명세서를 바탕으로 중요한 데이터 요소와 데이터 요소 간의 관계를 E-R 다이어그램으로 표현한다.
3단계 : 논리적 설계
개발에 사용할 DBMS에 적합한 논리적 데이터 모델을 이용해 개념적 설계 단계에서 생성한 개념적 구조를 기반으로 논리적 구조를 설계한다.
4단계 : 물리적 설계
데이터베이스의 물리적 구조는 데이터베이스를 저장 장치에 실제로 저장하기 위한 내부 저장 구조와 접근 경로 등을 의미한다. 그러므로 물리적 설계 단계에서는 저장 장치에 적합한 저장 레코드와 인덱스의 구조 등을 설계하고, 저장된 데이터와 인덱스에 빠르게 접근할 수 있는 탐색 기법 등을 정의한다.
5단계 : 구현
이전 설계 단계의 결과물을 기반으로 DBMS에서 SQL로 작성한 명령문을 실행하여 데이터베이스를 실제로 생성한다. (DDL)
데이터베이스 설계 예시
1단계 : 요구 사항 분석
- 한빛 마트 요구 사항 명세서
- 한빛 마트에 회원으로 가입하려면 회원아이디, 비밀번호, 이름, 나이, 직업을 입력해야 한다.
- 가입한 회원에게는 등급과 적립금이 부여된다.
- 회원은 회원 아이디로 식별한다.
- 상품에 대한 상품번호, 상품명, 재고량, 단가 정보를 유지해야 한다.
- 상품은 상품번호로 식별한다.
- 회원은 여러 상품을 주문할 수 있고, 하나의 상품을 여러 회원이 주문할 수 있다.
- 회원이 상품을 주문하면, 주문에 대한 주문번호, 주문수량, 배송지, 주문일자 정보를 유지해야 한다.
- 각 상품은 한 제조업체가 공급하고, 제조업체 하나는 여러 상품을 공급할 수 있다.
- 제조업체가 상품을 공급하면, 공급일자와 공급량 정보를 유지해야 한다.
- 제조업체에 대한 제조업체명, 전화번호, 위치, 담당자 정보를 유지해야 한다.
- 제조업체는 제조업체명으로 식별한다.
- 회원은 게시글을 여러 개 작성할 수 있고, 게시글 하나는 한 명의 회원만 작성할 수 있다.
- 게시글에 대한 글번호, 글제목, 글내용, 작성일자 정보를 유지해야 한다.
- 게시글을 글번호로 식별한다.
2단계 : 개념적 설계
요구 사항의 분석 결과를 ER 모델을 이용해 개념적 모델링을 하려면 먼저 핵심 요소인 객체(Entity)를 추출해야 한다. 그 다음 각 객체의 주요 속성과 키 속성을 선별하고, 객체 간의 관계를 결정해야 한다. 이 과정이 완료되면 그 결과를 ERD로 작성한다.
- 객체와 속성 추출
- 제시된 요구 사항의 문장들에서 업무 처리와 관련된 의미 있는 명사부터 찾는다.
- 찾아낸 명사를 객체와 속성으로 정확히 분류하는 작업이 필요하다.
객체 | 속성 |
회원 | 회원아이디, 비밀번호, 이름, 나이, 직업, 등급, 적립금 |
상품 | 상품번호, 상품명, 재고량, 단가 |
제조업체 | 제조업체명, 전화번호, 위치, 담당자 |
게시글 | 글번호, 글제목, 글내용, 작성일자 |
- 관계 추출
- 관계는 객체 간의 의미있는 연관성이다. 문장에서는 동사로 표현된다.
- 관계를 추출한 후에는 추출한 관계에 대한 매핑 카디널리티와 참여 특성을 결정한다.
- 매핑 카디널리티는 관계를 맺고있는 두 객체에서 각 객체 인스턴스가 관계를 맺고있는 상대 객체의 객체 인스턴스 개수를 의미한다.
- 먼저, 매핑 카디널리티를 기준으로 추출한 관계를 1:1, 1:n, n:m 중 하나로 분류한다.
- 그리고 객체가 관계에 필수적으로 참여하고 있는지, 선택적으로 참여하고 있는지를 의미하는 참여 특성을 결정한다.
관계 | 객체 | 매핑 | 속성 |
주문 | 회원(선택), 상품(선택) | n:m | 주문번호, 주문수량, 배송지, 주문일자 |
공급 | 상품(필수), 제조업체(선택) | n:1 | 공급일자, 공급량 |
작성 | 회원(선택), 게시글(필수) | 1:n |
3단계 : 논리적 설계
논리적 단계에서는 관계 데이터 모델을 이용하여 개념적 설계 단계의 결과물인 ERD를 관계 데이터 모델의 테이블 스키마로 변환하는 작업을 한다. 여기서 관계 데이터 모델에서는 개체와 관계를 구분하지 않고 모두 릴레이션으로 표현하며, 다중 값 속성과 복합 속성의 표현을 허용하지 않는다. 여기서는 ERD를 릴레이션 스키마로 변환할 때 적용할 수 있는 5가지 규칙을 소개한다. 물론 이상 현상이 발생할 수 있다. 따라서 정규화 과정을 통해 이상 현상이 발생하지 않도록 검증하는 작업을 수행하는 것이 좋다.
- 규칙 1. 모든 객체는 릴레이션으로 변환한다.
각 객체를 하나의 릴레이션으로 변환한다. 이때, 객체가 가지고 있는 속성이 복합 속성인 경우에는 복합 속성을 구성하고 있는 단순 속성만 릴레이션의 속성으로 변환한다.
- 규칙 2. n:m 관계는 릴레이션으로 변환한다.
다대다 관계를 하나의 릴레이션으로 변환한다. 이때, 관계의 이름을 테이블의 이름으로 하고, 관계의 속성도 테이블의 속성으로 그대로 변환한다. 그리고 각 객체 테이블의 기본키를 관계 테이블에 포함시키고, 외래키로 지정한다. 그리고 이 외래키들을 조합하여 관계 테이블의 기본키로 지정한다. 또는 별도의 속성을 생성하여 기본키로 지정할 수도 있다.
- 규칙 3. 일대다 관계는 외래키로 표현한다.
일대다 관계는 릴레이션으로 변환하지 않고, 외래키로만 표현한다.
- 1측 객체 테이블의 기본키를 가져와 n측 객체 테이블에 포함시키고, 외래키로 지정한다.
- 관계의 속성들도 n측 객체 릴레이션에 포함한다.
- 규칙 4. 일대일 관계는 외래키로 표현한다.
일대일 관계도 일대다 관계처럼 릴레이션으로 변환하지 않고, 외래키로만 표현해야 한다. 이때, 데이터의 중복을 피하려면 객체가 관계에 참여하는 특성에 따라 약간 다르게 처리해야 하므로, 세부 규칙을 나누어 적용한다.
- 규칙 4-1. 일반적인 일대일 관계는 외래키를 서로 주고받는다.
이때, 관계가 가지는 속성들을 관계에 참여하는 객체를 변환한 릴레이션에 모두 포함시킨다. 그런데 일대일 관계에 참여하고 있는 객체에 해당하는 릴레이션들이 서로의 기본키를 주고받아 이를 외래키로 지정하면 불필요한 데이터 중복이 발생하게 된다. 이때, 외래키를 지정하는 이유는 서로가 누구인지를 표현하기 위해서인데, 관계를 표현하기 위해서 양쪽 릴레이션이 모두 외래키를 가질 필요는 없다. 즉, 일대다 관계의 표현처럼 한쪽 릴레이션만 외래키를 가져도 관계를 표현하는데 충분하다. 이때 규칙 4-2를 적용할 수 있다.
- 규칙 4-2. 일대일 관계에 필수적으로 참여하는 객체의 릴레이션만 외래키로 받는다.
일대일 관계를 맺고 있는 두 객체 중 관계에 필수적으로 참여한느 객체에 대응하는 릴레이션에만 외래키를 포함시킨다. 즉, 관계에 필수적으로 참여하는 객체에 해당하는 릴레이션이 선택적으로 참여하는 객체에 해당하는 릴레이션의 기본키를 받아 외래키로 지정한다. 이때, 관계가 가지고 있는 속성들도 관계에 필수적으로 참여하는 객체에 해당하는 릴레이션에 함께 포함시킨다.
- 규칙 4-3. 모든 객체가 일대일 관계에 필수적으로 참여하면 관계 릴레이션 하나로 합친다.
- 규칙 5. 다중 값 속성은 릴레이션으로 변환한다.
관계 데이터 모델의 릴레이션에서는 다중 값을 가지는 속성을 허용하지 않는다. 그러므로 ERD에 있는 다중 값 속성은 그 속성을 가지고 있는 객체에 해당하는 릴레이션이 아닌 별도의 릴레이션을 만들어서 포함시킨다. 즉, 규칙 5를 적용해서 릴레이션을 분해해 다중 값 속성을 별도의 릴레이션에 포함시키면 불필요하게 중복 저장되는 문제를 제거할 수 있다.
- 기타 고려 사항
기본 변환 규칙에서는 다대다 관계만 릴레이션으로 변환하였지만, 일대일, 일대다 관계도 릴레이션으로 변환할 수 있다. 특히, 속성이 많은 관계는 관계 유형에 상관없이 릴레이션으로 변환하는 것을 고려할 수 있다. 하지만 그럴 경우 생성되는 릴레이션의 개수가 많아져 릴레이션을 관리해야 하는 DBMS의 부담이 커지게 된다. 따라서 외래키만으로도 표현이 가능한 일대일이나 일대다 관계는 릴레이션으로 변환하지 않는게 좋은 것이다. 또한 객체가 자기 자신과 관계를 맺는 순환 관계도 기본 규칙을 그대로 적용하면 된다. 즉, 순환 관계가 다대다 관계일 경우에는 릴레이션으로 변환하고, 일대일이나 일대다 관계일 경우에는 외래키로만 표현한다.
'컴퓨터 사이언스 > Database' 카테고리의 다른 글
데이터베이스 설계 실습 - 스타벅스 홈페이지 (0) | 2023.06.25 |
---|---|
데이터베이스 설계 실습 - 맥도날드 키오스크 (0) | 2023.06.25 |
정규화 (0) | 2023.06.25 |
키의 종류 (0) | 2023.06.24 |
Join 시, on과 where의 차이 (0) | 2023.04.13 |