[Oracle] 02. 데이터베이스 설계

shr·2022년 3월 6일

Oracle

목록 보기
2/2
post-thumbnail

1. 개념 설계

개요


DBMS의 종류, 프로그래밍 언어 등 모든 물리적인 고려 사항은 배제하고, 사용자의 관점에서 기업에서 사용되는 정보에 대한 개념적인 데이터 모델을 구축하는 것을 말한다. 업무를 분석하여 이를 약속된 표기법을 사용하여 개념적 모델로 표현한다.


방법


  1. 업무 기술서를 작성한다.

    📝 예시

  • 도서를 대출하기 위해서는 회원 가입을 하여야 한다. 회원 가입 시에는 이용자 이름, 전화번호, 집주소, 이메일을 입력한다. 회원 가입을 하면 회원증이 발급되고 회원카드에 부착된 바코드를 가지고 대출/반납 시 신분 확인을 할 수 있다. 회원 가입 즉시 도서를 대출할 수 있다. 회원에게는 자체 관리를 위해 회원번호가 부여된다. 일반 회원의 대출 가능 도서는 5권으로 제한한다. 회원탈퇴를 하려면 미반납도서가 없어야 한다. 회원이 탈퇴하면 회원 정보에 탈퇴 여부를 기록하고 월말 결산 시 탈퇴한 회원을 일괄 정리한다. 탈퇴한 회원이 재가입 시에는 최초 가입과 동일한 절차를 거친다.

  • 학생의 학번, 이름, 주소, 생년월일 등 개인 정보를 관리한다. 학생은 반드시 하나의 전공 학과에 속해야 하며 한 명의 지도 교수 밑에서 전공지도를 받는다. 매 학기마다 강의를 신청하여 수업을 듣는다. 교내에 개설된 과목에 대하여 과목명, 과목개요 등의 정보를 관리한다. 그리고 각 과목은 여러 개의 섹션으로 나누어 관리한다. 단 과목에 따라서는 섹션이 없을 수도 있다. 교수에 대해서는 교수 이름, 전공분야, 보유 기술 등의 정보를 관리한다. 특히 한 명의 교수가 여러 가지의 보유기술을 가질 수 있다. 그리고 교수는 몇 개의 과목을 강의하고 여러 학생에 대해 전공 지도를 할 수 있다. 전공 학과에 대해서는 학과명, 학과사무실의 위치, 학과 사무실의 전화번호 등의 정보를 관리한다. 그리고 각 학과의 교수들 중에서 한 명의 교수를 학과장에 임명한다. 학생은 자신이 듣고 싶은 과목을 수강하기 위해 수강신청을 한다.

  1. 업무 기술서를 바탕으로 엔티티를 찾는다.

    다음과 같은 업무 기술서가 있다고 하자.

    학교의 동아리 관리를 위한 시스템을 구축한다. 학교의 학생들이 동아리에 가입할 수 있어야 한다. 동아리에는 동아리 회장과 지도 교수가 있다. 동아리는 학술, 종교, 봉사, 레포츠, 기타로 분류한다. 동아리에게는 동아리 방이 제공된다.

    먼저 명사를 추출한다. 조금 단순하게 생각해 명사는 엔티티 또는 컬럼이 되고, 동사는 관계가 된다고 생각하면 쉽다.

    학교, 동아리, 관리, 시스템, 학생, 회장, 지도교수, 학술, 종교, 봉사, 레포츠, 기타, 동아리방

    개념이 불분명하거나 광범위한 것, 업무 프로세스에 해당하는 것을 제거한다.

    학교, 동아리, 관리, 시스템, 학생, 회장, 지도교수, 학술, 종교, 봉사, 레포츠, 기타, 동아리방

    남은 명사를 엔티티, 엔티티 후보군과 속성으로 분리한다.

    엔티티포함 속성
    동아리
    학생회장 여부
    지도 교수
    분류
    동아리방

    구축할 시스템에서 데이터를 관리할 필요가 있는 지 판단한다.

    엔티티포함 속성
    동아리지도 교수명, 동아리방 호실
    학생회장 여부
    분류

    한 가지 더 연습해 보자.

    엔티티를 찾는 작업을 할 때, 우리가 사용하기에 적절한 용어로 변경해 주는 것도 좋다.
    위와 같은 문제는 이런 식으로 엔티티를 찾을 수 있을 것이다.


2. 논리 설계

개요


DBMS에 맞춰 정규화와 무결성 제약을 정의하는 것을 말한다. 간단히 말해 테이블 간의 관계를 설정해 주는 것이다.

💡 정규화

테이블 설계가 잘못되면 이상 현상이 발생한다. 이상 현상을 줄이기 위한 과정을 정규화라고 한다.


관계의 종류


  • 1 : 1
    꼭 필요한 경우가 아니면 사용하지 않는다. 사원:건강 정보와 같이 꼭 필요할 때만 사용한다.

  • 1 : 다
    가장 일반적인 관계로, 외래 키를 이용해 표현한다. 강사:학생 같은 경우를 들 수 있다.

  • 다 : 다
    표현이 불가능하며, 중간 테이블(교차 엔티티)이 있어야만 한다. 예를 들면 고객:상품 사이에 주문 테이블이 존재하는 것을 들 수 있다.


관계의 참여도



식별과 비식별


  • 비식별 (빨강색 줄)
    사원 테이블의 부서 번호 컬럼 값이 null일 수 있다. 테이블과 작업 내용이 간단하고, 컬럼이 변경되더라도 부담이 없다는 것이 장점이다.

  • 식별 (초록색 줄)
    사원 테이블의 부서 번호 컬럼 값이 있어야만 사원을 만들 수 있다. (존재 종속) 공통 컬럼이 계속해서 존재하기 때문에 조인을 할 때 편리하다.

📝 작업을 할 때는 비식별이 편리하지만, 조인이 빈번하다면 식별 관계도 고려해 보아야 한다. 장단점을 생각해 적절하게 사용할 수 있도록 한다.


제 1 정규화


💡 함수 종속

한 속성을 제시했을 때, 종속 관계에 있는 다른 속성들을 유일하게 결정할 수 있는 것을 말한다. 예를 들어 주민번호가 이름, 출생지, 주소 등을 결정하는 것과 같다. 여기서 중요한 것은 기본 키가 반드시 다른 모든 속성들을 자신에게 함수 종속시켜야 한다는 점이다.

제 1 정규화는 한 속성이 여러 개의 값을 가지거나 반복 속성이 존재해서는 안된다는 것을 의미한다. 반복되는 속성들을 자식 엔티티로 분리한 후 자식 엔티티에 기본 키를 지정하고, 부모 엔티티와 식별 관계로 연결하는 것으로 수행한다.

고객과 카드는 1:다 관계이다. 따라서 고객의 기본 키인 고객 번호에 카드는 종속될 수 없으므로, 테이블을 분리했다.


제 2 정규화


위 엔티티의 기본 키는 복합 키로, 학번과 과목 번호이다. 따라서 학번과 과목 번호를 제시하면 학과와 점수가 출력된다. 그런데 학과는 학번만 제시해도 출력이 가능하다. 이를 부분 함수 종속이라고 한다. 제 2 정규화는 부분 함수 종속의 문제를 해결하는 것을 말한다.

수행 방법은 다음과 같다. 부분 함수가 종속된 속성(학번)을 분리한다. 이때 분리시킨 엔티티(오른쪽)가 부모 엔티티가 되고, 두 엔티티는 식별 관계가 된다.


제 3 정규화


위 엔티티의 기본 키는 학번이다. 학번을 제시하면 이름, 학과, 학과 평가 모두 하나의 값이 나온다. 그런데 학번과 학과 평가는 아무런 관계가 없고, 학번 → 학과 → 학과 평가로 이어진 관계다. 이를 이행적 함수 종속이라고 한다. 제 3 정규화는 이행적 함수 종속 문제를 해결하는 것을 말한다.

수행 방법은 다음과 같다. 이행적 함수가 종속된 속성(학과)을 분리한다. 이때 분리시킨 엔티티가 부모 엔티티가 되고, 두 엔티티는 비식별 관계가 된다.

profile
못하다 보면 잘하게 되는 거야 ・ᴗ・̥̥̥

0개의 댓글