[데이터베이스] #3. 관계형 모델

bien·2023년 5월 23일
0

데이터베이스

목록 보기
1/17

01. 관계형 모델의 개념

릴레이션의 특징

데이터베이스 모델링 과정

논리적 데이터 모델링 단계

  1. DBMS에서 사용하는 데이터 모델에 맞추어 데이터를 표현하는 과정
    (현재 시장에서는 관계형 DBMS를 가장 많이 사용하고 있음)
  2. 데이터 정의 언어로 기술된 개념 스키마 생성
    (데이터를 어떻게 담을 것인가에 관한 논의)
  3. 관계형 모델(relational model)
  • 1969년 에드가 F.코드에 의해 제안
  • 릴레이션relation으로 데이터를 표현하는 모델
  • 데이터 표현이 단순하고 직관적 구조화 모델
  • 현재 대다수 DBMS의 기초
    Oracle, DB2, PostgreSQL, MySQL, MSSQL등
    관계형 모델을 사용하는 관계형 DBMS(RDBMS)

릴레이션의 구성

관계형 데이터베이스

  • 표의 형태로 데이터를 정리한다.
  • 우리가 일상에서 데이터를 저장하는 방식과 유사해 간단하고 직관적이다.

릴레이션: 데이터를 담은 “표”
스키마: 표 머리글 행
레코드, 큐플(행): 스키마에 맞춰 열의 의미에 맞는대로 값을 채워 넣은 것
컬럼, 속성, 필드(열): 세로의 한 줄
컬럼값: 레코드와 컬럼이 만나 하나의 데이터를 형성한 것.
인스턴스: 특정 시점에서의 스키마에 맞춰서 데이터가 저장된 상태
(학과나 전화번호가 변경되는 등 데이터의 상태 자체는 변화할 수 있음)

데이터란 하나의 값에 두 개 이상의 메타 데이터가 만난 것을 이야기한다. 릴레이션(표)은 두 개의 메타 데이터(행,열)를 통해 하나의 값을 데이터화 시키는 데 최적화인 방법.

릴레이션의 특징

레코드의 유일성: 중복된 레코드의 존재가 불가능.
레코드의 무순서성: 레코드의 순서는 의미가 없음.
컬럼의 무순서성: 컬럼은 순서가 없고, 이름과 값의 쌍.
컬럼값의 원자성: 모든 값들은 나눌 수 없는, 단 하나의 의미.
(컴퓨터 과학과의 전화번호는 딱 하나만이 들어가야 함. ,로 구분해가면서 여러 값을 넣는 것은 컬럼값의 원자성을 위배하는 것)

키의 역할

  1. 릴레이션의 레코드를 유일하게 식별하는 값.
  • 학과이름, 전화번호: 키 설정 가능
  • 단과대학, 졸업학점: 키 설정 불가능.

키의 종류 및 속성

  1. 키의 속성: 각각의 레코드를 식별할 수 있는 값을 담고있는 컬럼.
    유일성(Uniqueness) 각각의 레코드마다 다른 값을 가지고 있을 것.
    최소성(Irreducibility)

  2. 키의 종류

  • 수퍼키(super key): 유일성 만족
  • 후보키(candidate key): 유일성, 최소성 만족 -> 기본키가 될 수 있는 후보.
  • 기본키(PK: primary key): 레코드의 구분을 위해 선택된 후보.
  • 외래키(FK: foreign key): 참조된 다른 릴레이션의 기본키.

관계형 모델의 예

  1. 수퍼키: 학과이름, {학과이름, 단과대학}, 주소, 전화번호, {전화번호, 졸업학점} 등
    학과이름, 단과대학 두 개의 컬럼을 합치면 중복되는 레코드가 없음. 두 개의 컬럼을 합쳐서 하나의 복합적인 키로 사용할 수 있음. -> 유일성 만족.
  2. 후보키: 학과이름, 주소, 전화번호
    후보키는 최소성을 만족해야 함. {학과이름, 단과대학} 조합은 단과대학 없이 학과이름만으로도 레코드를 구별할 수 있음. 따라서 최소성 만족하지 않아 후보키가 될 수 없음.
    단과대학 없이도 학과이름 만으로 유일성을 만족한다. 따라서 단과대학은 필요 없으므로 최소성이 성립되지 않는다.
  3. 기본키: 학과이름
    db에 딱 집어서 이걸 지정한 것.

키의 참조 (=외래키)


1. 두 릴레이션에 포함된 레코드 간 연관성을 표현. = 외래키(FK)
키의 참조관계를 잘 알아둘것!

관계형 모델의 제약조건

관계형 모델이 정확하게 유지되기 위해서 만족해야 하는 특정 조건들
1. 영역 제약 조건: 컬럼에 정의된 영역(domain)에 속한 값으로만 컬럼값이 결정
실제 가질 수 있는 값들을 한정해 놓은 것. 데이터의 무결성 유지.
(ex. 이름에는 숫자가 들어갈 수 없다. 전화번호에는 문자가 들어갈 수 없다. 학점은 150 이하의 값만 입력 가능하다 etc..)

2. 키 제약조건: 키는 레코드를 고유하게 구별하는 값으로 구성.
키로 지정된 컬럼에는 서로 다른 레코드가 같은 값을 가질 수 없고, 사용자가 넣으려고 하면 중복을 거절
3. 개체 무결성 제약조건: 어떠한 기본키 값도 널(null)이 될수 없음.
4. 참조 무결성 제약조건: 반드시 존재하는 레코드의 기본키만 참조 가능.
존재하지 않는 기본키를 외래키가 참조할 수는 없다

널(NULL)의 개념

아직 값이 정해지지 않은 경우, 임의로 0같은 숫자를 집어 넣으면, 자료 해석이 이상할 수 있음(ex. 연봉이 아직 결정되지 않은 경우, 임의로 0을 집어넣으면 자료를 해석하는 입장에서 연봉이 0원이라 오해할 수 있음. 혹은 다른이들은 원화로 기록되어 있는데 혼자 달러로 표기되면 연봉의 수치에 대한 오해가 있을 수 있음.)
1. ‘없음’ 또는 ‘0’이 아닌 미지의 값에 대한 표현

  • 입력된 적이 없는 값.
  • 적용 불가능한 값.(입력될 수 없는 값)

기본키는 새로운 레코드가 삽입될 때 무조건 값이 차있어야 함
(대체 무결성 제약조건)
기본키가 설정되어있지 않으면, 해당 레코드에 접근하여 정보를 수정할 수 없게됨.


02. ERD의 변환

ER 다이어그램 변환 규칙

논리적 데이터 모델링

  1. DBMS의 구현 모델에 맞춰 데이터를 표현하는 과정
  2. 데이터 정의 언어로 기술된 개념 스키마 생성
  3. 논리적 데이터 모델링의 필요
  • 관계형 dbms의 구현 모델에 맞춰 데이터의 구조와 관계를 표현
  • 작성된 ERD를 RDBMS가 수용 가능하는 구조로 변환
    실제 데이터가 저장되는 방식에 맞춰 ERD를 관계형 모델이 사용하는 릴레이션으로 변화시키는 것.

관계형 모델로 변환 방법

  1. 개체집합: 개체 집합은 릴레이션으로 변환
  2. 약한 개체 집합: 강한 개체 집합의 키 속성을 약한 개체 집합의 릴레이션에 포함
  3. 일대일 관계: 두 릴레이션 중에서 한 릴레이션의 기본키를 다른 릴레이션에서 외래키로 참조
  4. 일대다 혹은 다대일 관계: ‘일’쪽의 기본키를 ‘다’쪽의 릴레이션에서 외래키로 참조
  5. 다대다 관계: 관계 릴레이션을 생성하고, 둘 릴레이션의 기본키를 각각 참조하는 외래키를 복합키 형태의 컬럼으로 구성
  6. 다중값 속성: 릴레이션의 기본키를 참조하는 외래키와 다중값 속성으로 별도의 릴레이션으로 구성
  7. 관계 집합의 속성: 외래키가 위치한 릴레이션의 컬럼으로 삽입

ER 다이어그램의 변환

  • 하나의 개체가 하나의 릴레이션이 된다.
  • 교수와 과목의 강의관계는 '외래키'를 통해 표현된다.


어떤 학생이 수강신청을 하면 그때 ‘신청 시각’이 만들어지는 특수한 속성을 가짐.
다대다의 관계에서는 외래키로 참조가 힘들다. => 그 관계 자체가 새로운 릴레이션을 만들게 됨.
1:1, 1:대는 새로운 릴레이션 X. 다대다의 경우에서만 그 관계집합이 하나의 릴레이션으로 바뀜.

다대다 관계의 변환

  • 관계 집합이 하나의 릴레이션을 형성
  • 각각의 개체집합으로 만들어지는 릴레이션의 기본키가 참조되어 외래키가 된다.
  • 관계집합의 속성(신청시각)은 외래키가 위치한곳에 따라들어온다.
    (만약 과목에 외래키가 들어간다면, 과목에 관계집합의 속성이 들어감)

약한 관계집합과 약한 개체집합.
1대1의 관계에서는 양쪽 다 참조키가 가능하나, 되도록 '개수가 적은 쪽'으로 참조키가 가는게 좋다.
지금은 레코드가 적은 계좌쪽이 좋을 것.

약한관계이므로 단순히 외래키가 아니라, 참조된 외래키가 그 테이블의 계좌번호와 뭉쳐져서 복합키가 기본키를 이루도록 만드는 것이 좋다.
학생 번호가 없어지면서, 참조번호 무결성에 의해 계좌도 삭제해야만 하는 효과를 만들기 위함.


03. 데이터 연산

관계 연산의 개념

  1. 관계형 모델을 기반으로 구성된 릴레이션을 사용해서 새로운 릴레이션을 생성하는 표현
  2. 사용자의 관점에서 필요한 데이터를 릴레이션에서 추출하는 방법을 제공하는 도구
  3. 관계 대수(relational algebra)
    - 관계 연산을 정의하는 방법
    - 주어진 릴레이션에서 필요한 릴레이션을 만드는 연산자(∪, ∩,
    -, σ, π, x, ⋈, ÷, 집계함수 등)로 구성
    - 관계 대수 연산자는 새로운 임시 릴레이션을 생성
    - 연산자를 중첩하여 연산 처리 절차를 표현

예시 표:

셀렉트 연산

  1. 주어진 릴레이션에서 조건을 만족하는 레코드를 갖는 릴레이션을 생성

  2. 조건:aΘb 또는 aΘv

  3. 조건의 결합: ∧(and), ∨(or)

셀렉트 연산의 예

  • 소속학과가 텀퓨터학과인 교수만을 출력하고 싶은 경우
    σ소속학과=‘컴퓨터과학과’(교수)

  • 소속학과가 컴퓨터학과이고, 연봉이 5000만원 이상인 교수를 출력하고 싶은 경우
    σ소속학과=‘컴퓨터과학과’ ˄ 연봉≥50000000 (교수)

참고 : σ 조건 (R:릴레이션)

프로젝트 연산

레코드가 아닌 한 컬럼만 전부 보고싶은 경우
1. 기술된 컬럼만 갖는 릴레이션으로 재구성

  1. <컬럼리스트> : A1,A2, ..., An과 같이 R에 존재하는 컬럼을, (콤마)로 분리하여 기술

프로젝션 연산의 예

  • 교수이름과 소속학과 두 컬럼만 보고 싶은 경우
    π 교수이름, 소속학과(교수)

관계 대수 연산식의 활용

Q. 직위가 '부교수'인 교수의 교수 이름을 출력하라.

  • 직위가 부교수인 경우.
    σ 직위='부교수'(교수)

  • 직위가 부교수인 교수들에 대한 데이터 중, 교수 이름 컬럼만 추출.
    π 교수이름(σ 직위='부교수'(교수))

한번 SELECT 연산한 컬럼을 프로젝트를 통해 특정 컬럼만 추출. 관계대수는 연산을 중첩시켜 최종적으로 사용자가 원하는 데이터를 갖도록 도움.

집합 연산자

  1. 수학적 집합 이론에서의 이진 연산
    • 합집합: R ∪ S
    • 교집합: R ∩ S
    • 차집합: R – S
  2. 릴레이션은 집합, 레코드는 집합에 포함된 원소
  3. 집합 연산자 사용 조건
    • 릴레이션 R과 S의 차수가 동일
      (차수: 한 릴레이션에 포함된 컬럼의 개수)
    • 모든 i에 대해 R의 i번째 컬럼의 도메인과 S의 i번째 컬럼의 도메인이 반드시 동일
      (R의 i번째는 문자이고, S의 i번째는 숫자이면, 합집합을 사용해 함께 표현할 때 어떻게 묘사해야 하는지 알 수 없음.

카티시언 프로덕트 연산

  1. 두 릴레이션에 포함된 레코드간의 모든 조합을 생성하는 이항 연산자
    카티시언 프로덕트 연산의 예
    (두 릴레이션의 레코드를 하나로 합치는 것. 조합 가능한 조합은 다 더해버림. 반드시 두개의 릴레이션이 제공되어야 한다!)

카티시언 프로덕트 연산의 예

학과 이름이라는 기본키가 참조되어서 소속학과에 들어가있으나, 그러한 연관성을 전혀 고려하지 않고 조합가능한 모든 조합을 시행한다.

결과:

이게뭐야, 그냥 결합시킨거네. 막 조합시켜서 불필요한 레코드를 잔뜩 만든거네? 라고 생각할 수 있으나, 서로 다른 두 릴레이션의 레코드를 결합시키기 때문에 중요하다 볼 수 있다!

조인 연산

카티시언 연산자와 유사하나, 한가지의 차이가 있음. 모든 요소에 대한 조합을 다 취하는 것이 아니라, 조건에 맞는 레코드들만 서로 결합시키는 조건 기반의 카티시안 프로덕트 연산자임!!

  1. 두 릴레이션에서 조건을 만족하는 레코드를 결합한 레코드로 구성된 릴레이션을 생성
  • 카티시언 프로덕트를 수행하고 나서 쓸데없는 많은 자료들 중 조건에 맞는 레코드만 추출!
  • join연산 : 카티시언 프로덕트 + select
    => 따라서 카티시안 연산이 매우 중요하다!

Q. '컴퓨터과학과' 소속의 교수가 강의하는 과목의 과목명과 과목코드는?

질문에서 요구되는 교수: in "교수 릴레이션" + 과목명, 과목코드: in "과목 릴레이션" => 서로 다른 릴레이션에 있는 정보를 추출해야만 함!

관계형 dbms는 어떤 요청에 대해 단 하나의 임시 릴레이션으로 결과를 도출해야 한다. 두개의 릴레이션에 서로 따로 정보를 요청하는 것은 불가능하고, 한 번의 연산을 통해 단 하나의 결과(릴레이션)로 나와야만 제대로 처리한 것이다.

셀렉트, 프로젝트 연산: 단 하나의 릴레이션에서 조작. 두개의 릴레이션에서 데이터를 조작하는 연산자는 아니었음.

어떤 질문은 처리를 위해 두 개의 릴레이션을 동시에 조작해야 하는데, 그럴 때 카티시안 프로덕트와 조인 연산이 매우 중요한 역할을 수행한다.

조인 연산의 예

  • 카타시안 프로젝트 연산 수행

: 쓸모없는 데이터가 잔뜩 생산됨.
: 테이블을 보면, 과목에 있는 교수번호와 교수에 있는 교수번호가 같은게 있음. 이 레코드만 쓸모있는 올바른 정보.
: 따라서 해당 레코드만 남기고 다른 쓸모없는 데이터들을 모두 제거하면 된다!

조인 연사자를 이용해 표현한 경우:

Q. 컴퓨터과학과 교수가 담당하는 과목명과 과목코드만 출력하세요!

  • π 과목명, 과목코드(σ 소속학과=컴퓨터과학과(σ과목.교수번호 = 교수.교수번호(과목*교수)))
  • π 과목명, 과목코드(σ 소속학과=컴퓨터과학과(과목⋈과목.교수번호 = 교수.교수번호(교수)))

집계 함수 연산

여러가지 통계를 위한 연산
1. 집계함수를 값들의 집합바 또는 레코드의 집합에 적용하는 연산

  • x(): AVG, SUM, MIN, MAX, COUNT등의 집계 함수
  • A: 집계 연산을 적용할 컬럼

잡계함수의 예

Q. 실제 K대학에 개설된 과목은 몇개인가요?
셈을 해야하는 연산은 집계함수가 수행한다! 갯수를 세거나 가장 큰 값 ,가장 작은 값, 합계 등을 연산해준다.

집계 함수 연산

또 다른 형태 그룹화를 시켜서 그룹별로 연산 시행해줄 수 있다.
1. 레코드 그룹화를 위해 집계 함수 연산자 앞에 그룹화 속성을 기술

  • B: 그룹의 기준이 되는 컬럼 주요 차이점
  • x(): 집계함수
  • A: 집계 연산을 적용할 컬럼
  • R: 릴레이션

집계 함수의 사용 예

Q. 소속학과 별 교수가 몇명인가요?
(기준을 통해 그룹을 맺고, 그룹을 기준으로 연산을 행할 수 있다!)

B에 소속학과를 넣으면, 이 값이 같은 레코들끼리만 그룹을 만들고, 그 그룹별로 연산이 적용된다!

profile
Good Luck!

0개의 댓글