데이터베이스

Jiwon An·2021년 11월 3일
0

CS/데이터베이스

목록 보기
1/1

1. 데이터베이스

1.1 데이터와 정보

  • 데이터 : 현실 세계에서 단순히 관찰하거나 측정하여 수집한 사실이나 값이다.
  • 정보 : 의사 결정에 유용하게 활용할 수 있도록 데이터를 처리한 결과물이다.

1.2 정보 처리, 정보 시스템, 데이터베이스

  • 정보 처리 : 데이터에서 정보를 추출하는 과정 또는 방법이다.
  • 정보 시스템 : 조직을 운영하기 위해 필요한 데이터를 수집하여 저장해두었다가 필요할 때 유용한 정보를 만들어주는 수단이다.
  • 데이터베이스 : 정보 시스템 안에서 데이터를 저장하고 있다가 필요할 때 제공하는 역할을 한다.

1.3 데이터베이스의 정의

특정 조직의 여러 사용자가 '공유'해서 사용할 수 있도록 '통합'해서 '저장''운영' 데이터의 집합이다.

  • 여러 사용자가 함께 소유하고 사용할 수 있는 '공유 데이터'
  • 중복을 최소화한 '통합 데이터'
  • 컴퓨터가 접근할 수 있는 매체에 들어 있는 '저장 데이터'
  • 조직의 주요 기능을 수행하기 위해 반드시 필요한 '운영 데이터'

1.4 데이터베이스의 특징

  • '실시간 접근'이 가능하다.
    데이터베이스는 사용자의 데이터 요구에 실시간으로 응답할 수 있어야 한다.
  • '계속 변화'한다.
    데이터베이스는 동적인 특징이 있어 데이터를 계속 삽입/삭제/수정하여 현재의 정확한 데이터를 유지해야 한다.
  • '동시 공유'가 가능하다.
    동시 공유는 여러 사용자가 서로 다른 데이터를 동시에 사용하는 것뿐 아니라, 같은 데이터를 동시에 사용하는 것도 모두 지원한다는 의미다.
  • '내용으로 참조'가 가능하다.
    데이터베이스는 저장된 주소나 위치가 아닌 데이터의 내용, 즉 값으로 참조할 수 있다.

1.5 데이터의 분류

  • 정형 데이터

    • 구조화된 데이터, 즉 미리 정해진 구조에 따라 저장된 데이터다.
    • ex) 엑셀의 스프레드시트
  • 반정형 데이터

    • 구조에 따라 저장된 데이터이지만 정형 데이터와 달리 데이터 내용 안에 구조에 대한 설명이 함께 존재한다.
    • 데이터 내용에 대한 설명, 즉 구조를 파악하는 파싱 과정이 필요하다.
    • ex) HTML, XML, JSON 문서나 웹 로그, 센서 데이터
  • 비정형 데이터

    • 정해진 구조가 없이 저장된 데이터다.
    • ex) 텍스트, 영상, 이미지, 워드나 PDF 같은 멀티미디어 데이터

2. 데이터베이스 관리 시스템

2.1 파일 시스템

  • 데이터를 파일로 관리하기 위해 파일의 생성, 삭제, 수정, 검색 기능을 제공하는 소프트웨어다.
  • 응용 프로그램마다 필요한 데이터를 별도 파일로 관리한다.
  • 데이터 중복성과 데이터 종속성 문제가 발생한다.

2.2 데이터베이스 관리 시스템(DBMS)

  • 파일 시스템의 데이터 중복과 데이터 종속 문제를 해결하기 위해 제시된 소프트웨어다.
  • 조직에 필요한 데이터를 데이터베이스에 통합하여 저장해두고 이를 관리한다.

2.3 데이터 관리 시스템의 주요 기능

  • 정의 기능 : 데이터베이스의 구조를 정의하거나 수정한다.
  • 조작 기능: 데이터를 삽입, 삭제, 수정, 검색하는 연산을 한다.
  • 제어 기능 : 데이터를 항상 정확하고 안전하게 유지한다.
    • 데이터를 삽입, 삭제, 수정하는 연산을 한 후에도 내용이 일관되면서 무결성을 유지하게 한다.
    • 장애가 발생해도 회복이 가능하도록 제어한다.
    • 권한이 있는 사용자에게만 데이터 접근을 허용하여 보안이 유지되도록 제어한다.
    • 여러 사용자가 데이터베이스에 동시에 접근하여 데이터를 처리할 수 있도록 제어한다.

3. 데이터베이스 시스템

3.1 데이터베이스 시스템

  • 데이터베이스에 데이터를 저장하고, 이를 관리하여 조직에 필요한 정보를 생성해주는 시스템이다.
  • 사용자, 데이터 언어, 데이터베이스 관리 시스템, 데이터베이스, 컴퓨터로 구성된다.

📌 데이터베이스, 데이터베이스 관리 시스템, 데이터베이스 시스템

  • 데이터베이스 : 데이터를 저장해두는 곳
  • 데이터베이스 관리 시스템 : 데이터베이스에 저장된 데이터가 일관되고 무결한 상태로 유지되도록 관리하는 역할
  • 데이터베이스 시스템 : 데이터베이스와 데이터베이스 관리 시스템을 이용해 조직에 필요한 정보를 제공해주는 전체 시스템

3.2 스키마와 인스턴스

  • 스키마 : 데이터베이스에 저장되는 데이터 구조와 제약조건을 정의한 것이다.
  • 인스턴스 : 스키마에 따라 데이터베이스에 실제로 저장된 값이다.

3.3 3단계 데이터베이스 구조

데이터베이스를 쉽게 이해하고 이용할 수 있도록 하나의 데이터베이스를 관점에 따라 세 단계로 나눈 것이다.

  • 외부 단계 : 데이터베이스를 개별 사용자 관점에서 이해하고 표현한다.
    • 사용자에게 필요한 데이터베이스를 정의한 외부 스키마가 여러 개 존재할 수 있다.
    • 외부 스키마는 각 사용자가 생각하는 데이터베이스의 모습을 표현한 논리적인 구조로, 사용자마다 다르다.
    • 외부 스키마는 개념 스키마를 기초로 하여 사용자의 이용 목적에 맞게 만들어진다.
  • 개념 단계 : 데이터베이스를 조직 전체의 관점에서 이해하고 표현한다.
    • 데이터베이스 전체의 논리적 구조를 정의한 개념 스키마가 하나만 존재한다.
    • 개념 스키마는 데이터베이스 관리 시스템이나 관리자의 관점에서 모든 사용자에게 필요한 데이터를 통합하여 전체 데이터베이스의 논리적 구조를 정의한 것이다.
    • 개념 스키마는 전체 데이터베이스에 저장되는 데이터 종류, 데이터들 간의 관계 및 제약조건, 데이터에 대한 보안 정책, 접근 권한에 대한 정의가 포함한다.
  • 내부 단계 : 데이터베이스를 물리적인 저장 장치의 관점에서 이해하고 표현한다.
    • 데이터베이스가 저장장치에 실제로 저장되는 방법을 정의한 내부 스키마가 하나만 존재한다.
    • 내부 스키마는 데이베이스의 개념 스키마에 대한 물리적인 저장 구조를 표현하므로 데이터베이스에 하나만 존재한다.
    • 내부 스키마는 파일에 데이터를 저장하는 레코드의 구조, 레코드를 구성하는 필드의 크기, 인덱스를 이용한 레코드 접근 경로 등을 정의한다.

3.4 데이터 독립성

3단계 데이터베이스 구조의 목적은 데이터 독립성을 실현하는 데 있다. 데이터 독립성은 하위 스키마를 변경하더라도 상위 스키마가 영향을 받지 않는 특성이다. 데이터 독립성에는 논리적 데이터 독립성과 물리적 데이터 독립성이 존재한다.

  • 논리적 데이터 독립성 : 개념 스키마가 변경되어도 외부 스키마는 영향을 받지 않는다(외부/개념 사상).
    • 전체 데이터베이스의 논리적인 구조가 변경되어도 관련된 외부/개념 사상 정보만 적절히 수정해주면 직접 관련이 없는 사용자를 위한 외부 스키마는 변경할 필요가 없다.
    • 외부/개념 사상은 응용 인터페이스라고도 한다.
  • 물리적 데이터 독립성 : 내부 스키마가 변경되어도 개념 스키마는 영향을 받지 않는다(개념/내부 사상).
    • 데이터베이스의 저장 구조가 변경되어도 관련된 개념/내부 사상 정보만 적절히 수정해주면 직접적으로 관련이 없는 데이터베이스의 논리적 구조는 영향을 받지 않는다.
    • 개념/내부 사상은 저장 인터페이스라고도 한다.

👉 스키마 사이의 대응 관계를 사상 또는 매핑이라 한다.

3.5 데이터 사전(시스템 카탈로그)

데이터베이스에 저장되는 데이터에 관한 정보, 즉 메타 데이터를 저장하는 시스템 데이터베이스다.

  • 데이터 사전은 데이터베이스에 저장되어 있는 데이터를 정확하고 효율적으로 이용하기 위해 참고해야 되는 스키마, 사상 정보, 다양한 제약조건 등을 저장하고 있다.
  • 데이터 사전은 데이터베이스 관리 시스템이 스스로 생성하고 유지하는 것으로, 데이터베이스 관리 시스템은 추가, 수정할 수 있는 반면, 사용자는 저장 내용을 검색만 할 수 있다.
  • 데이터 사전에 있는 데이터에 실제로 접근하는 데 필요한 위치 정보는 데이터 디렉토리에서 관리하고, 시스템만 접근할 수 있다.

3.6 데이터베이스 사용자

사용자는 데이터베이스를 이용하기 위해 접근하는 모든 사람을 의미한다. 데이터베이스 관리자, 최종 사용자, 응용 프로그래머로 나눈다.

  • 데이터베이스 관리자 : 데이터베이스 시스템을 운영, 관리한다.
  • 최종 사용자(일반 사용자) : 데이터베이스에 접근하여 데이터를 조작(삽입, 삭제, 수정,검색)한다.
  • 응용 프로그래머 : 데이터 언어를 삽입하여 응용 프로그램을 작성한다.

3.7 데이터 언어

데이터 언어는 사용자와 데이터베이스 관리 시스템 간의 통신 수단이다. 데이터 정의어, 데이터 조작어, 데이터 제어어로 나눈다.

  • 데이터 정의어(DDL) : 스키마를 정의하거나, 수정 또는 삭제하기 위해서 사용한다.

    • 정의된 스키마는 데이터 사전에 저장되고, 삭제나 수정이 발생하면 이 내용도 데이터 사전에 반영된다.
  • 데이터 조작어(DML) : 데이터의 삽입, 삭제, 수정, 검색 등의 처리를 요구하기 위해서 사용한다.

    • 데이터 정의어를 이용해 정의된 스키마에 따라 조직에 필요한 실제 데이터 값(인스턴스)이 저장되는데, 사용자가 실제 데이터 값(인스턴스)을 활용하기 위해 사용하는 언어다.
    • 설명 방식에 따라 절차적 데이터 조작어와 비절차적 데이터 조작어로 나눈다.
      • 절차적 데이터 조작어 : 사용자가 어떤 데이터를 원하고 해당 데이터를 얻으려면 어떻게 처리해야 하는지를 설명한다.
      • 비절차적 데이터 조작어(선언적 언어) : 사용자가 어떤 데이터를 원하는지만 설명한다. 즉, 해당 데이터를 얻으려면 어떻게 처리해야 하는지는 데이터베이스 관리 시스템에 맡긴다.
  • 데이터 제어어(DCL) : 동시 공유가 가능하면서도 무결성과 일관성을 유지하도록 내부적으로 필요한 규칙이나 기법들을 정의하기 위해서 사용한다.

    • 이 규칙과 기법을 정의하는 이유는 무결성, 보안, 회복, 동시성을 보장하기 위해서다.

3.8 데이터베이스 관리 시스템

주요 기능은 데이터베이스 관리와 데이터 처리 요구에 대한 수행이다. 질의 처리기와 저장 데이터 관리자로 나눈다.

  • 질의 처리기 : 사용자의 데이터 처리 요구를 해석하여 처리한다.

    • DDL 컴파일러 : 데이터 정의어로 작성된 스키마의 정의를 해석하거나 기존 스키마의 삭제나 수정 요청도 처리하여, 변경된 내용을 데이터 사전에 적용한다.
    • DML 프리 컴파일러 : 응용 프로그램에 삽입된 데이터 조작어를 추출하여 DML 컴파일러에 전달한다. 단, 데이터 조작어와 관련 없는 나머지 코드들은 해당 언어의 컴파일러에 보내진다.
    • DML 컴파일러 : 데이터 조작어로 작성된 데이터의 처리 요구를 분석하여 런타임 데이터베이스 처리기가 이해할 수 있도록 해석한다.
    • 런타임 데이터베이스 처리기 : 저장 데이터 관리자를 통해 데이터베이스에 접근하여, DML 컴파일러로부터 전달받은 데이터 처리 요구를 데이터베이스에서 실제로 실행한다.
    • 트랜잭션 관리자 : 데이터베이스에 접근하는 과정에서 사용자의 접근 권한이 유효한지를 검사하고, 데이터베이스 무결성을 유지하기 위한 제약조건 위반 여부를 확인한다. 회복이나 병행 수행과 관련된 작업도 담당한다.
  • 저장 데이터 관리자 : 디스크에 저장된 데이터베이스와 데이터 사전을 관리하고, 여기에 실제로 접근한다. 운영체제의 도움을 받아 데이터베이스에 대한 접근을 수행한다.

4. 데이터 모델링

4.1 데이터 모델링

데이터 모델링은 현실 세계에 존재하는 데이터를 컴퓨터 세계의 데이터베이스로 옮기는 변환 과정이다. 개념적 데이터 모델링과 논리적 데이터 모델링이 있다. 보통 개념적 모델링과 논리적 모델링을 통틀어 데이터베이스 설계라고 한다.

  • 개념적 데이터 모델링 : 현실 세계의 중요 데이터를 추출하여 개념 세계로 옮긴다.
  • 논리적 데이터 모델링 : 개념 세계의 데이터를 데이터베이스에 저장하는 구조로 표현한다.

4.2 데이터 모델

데이터 모델링의 결과물을 표현하는 도구로, 개념적 데이터 모델과 논리적 데이터 모델이 있다.

  • 개념적 데이터 모델 : 현실 세계를 사람의 머리로 이해할 수 있도록 개념적 모델링의 결과물인 개념적 구조로 표현하는 도구다. 대표적으로 개체-관계 모델(E-R Model)이 있다.
  • 논리적 데이터 모델 : 개념적 구조를 논리적 모델링의 결과물인 논리적 구조로 표현하는 도구다. 대표적으로 관계 데이터 모델이 있다.

4.3 개체-관계 모델

개체와 개체 간의 관계를 이용해 현실 세계를 개념적 구조로 표현하는 개념적 데이터 모델이다.

개체

현실 세계에서 조직을 운영하는 데 꼭 필요한 사람이나 사물과 같이 구별되는 모든 것을 의미한다.

  • 개체는 다른 개체와 구별되는 이름을 가지고 있고, 각 개체만의 고유한 특성이나 상태, 즉 속성을 하나 이상 가지고 있다.
  • 개체를 고유의 이름과 속성들로 정의한 것을 개체 타입(entity type)이라 한다.
  • 개체를 구성하고 있는 속성이 실제 값을 가짐으로써 실체화된 개체를 개체 인스턴스라 한다.
  • 특정 개체 타입에 대한 개체 인스턴스들을 모아 놓은 것을 개체 집합이라 한다.
    • 데이터베이스에서 실제로 저장하고 관리하는 것이 개체 집합이다.

📌 개체와 속성은 파일 구조에서 레코드와 필드 용어에 대응된다. 개체 타입은 레코드 타입에, 개체 인스턴스는 레코드 인스턴스에 대으오딘다.

속성

개체나 관계가 가지고 있는 고유의 특성이다.

  • 속성의 유형 : 속성 값의 개수, 의미의 분해 가능성, 기존 속성 값에서 유도에 따라 분류할 수 있다.
    • 속성 값의 개수
      • 단일 값 속성 : 특정 개체를 구성하는 속성의 값이 하나일 때
      • 다중 값 속성 : 특정 개체를 구성하는 속성이 값을 여러 개 가질 수 있을 때
    • 의미의 분해 가능성
      • 단순 속성 : 의미를 더는 분해할 수 없는 속성, 즉 의미가 하나일 때
      • 복합 속성 : 의미를 분해할 수 있어 값이 여러 개의 의미를 포함할 때
  • 기존 속성 값에서 유도
    • 유도 속성 : 값이 별도로 저장되는 것이 아닌 기존의 다른 속성 값에서 유도되어 결정되는 속성
    • 저장 속성에 실제로 값을 저장하고, 유도 속성은 필요할 때마다 계산되므로 값을 따로 저장할 필요가 없다.
  • 널 속성 : 널 값이 허용되는 속성
    • 널(null) 값
      • 아직 결정되지 않았거나 모르는 값을 의미한다.
      • 또는 해당되는 값이 없는, 즉 존재하지 않는 값의 경우
      • 값을 아직 갖지 않은 것으로, 공백이나 0과는 다르다.
  • 키 속성 : 개체 집합에 존재하는 각 개체 인스턴스들을 식별하는 데 사용하는 속성 (하나 이상으로 구성)

관계

개체와 개체가 맺고 있는 의미 있는 연관성이다. 개체 집합들 사이의 대응 관계, 즉 매핑을 의미한다.

  • 관계의 유형 : 관계에 참여하는 개체 타입의 수, 매핑 원소의 수(매핑 카디널리티)에 따라 분류할 수 있다.
    • 관계에 참여하는 개체 타입의 수
      • 이항 관계 : 개체 타입 두 개가 맺는 관계
      • 삼항 관계 : 개체 타입 세 개가 맺는 관계
      • 순환 관계 : 개체 타입 하나가 자기 자신과 맺는 관계
  • 매핑 카디널리티 : 관계를 맺는 두 개체 집합에서, 각 개체 인스턴스가 연관성을 맺고 있는 상대 개체 집합의 인스턴스 개수
    • 관계는 매핑 카디널리티를 기준으로 일대일(1:1), 일대다(1:n), 다대다(n:n) 유형으로 분류할 수 있다.
    • 일대일 관계
      개체 A의 각 개체 인스턴스가 개체 B의 개체 인스턴스 하나와 관계를 맺을 수 있고, 개체 B의 각 개체 인스턴스도 개체 A의 개체 인스턴스 하나와 관계를 맺을 수 있을 때의 두 개체의 관계
    • 일대다 관계
      개체 A의 각 개체 인슽너스는 개체 B의 개체 인스턴스 여러 개와 관계를 맺을 수 있지만, 개체 B의 각 개체 A의 개체 인스턴스 하나와만 관계를 맺을 수 있을 때의 두 개체의 관계
    • 다대다 관계
      개체 A의 각 개체 인스턴스가 개체 B의 개체 인스턴스 여러 개와 관계를 맺을 수 있고, 개체 B의 각 개체 인스턴스도 개체 A의 개체 인스턴스 여러 개와 관계를 맺을 수 있을 때의 두 개체의 관계
  • 관계의 참여 특성 - 필수적 참여(전체 참여), 선택적 참여(부분 참여)
    개체 A와 B 사이의 관계에서, 개체 A의 모든 개체 인스턴스가 관계에 반드시 참여해야 될 때 개체 A가 관계에 '필수적 참여한다'라고 한다.
  • 관계의 종속성 - 강한 개체, 약한 개체
    • 존재 종속 : 두 개체가 관계에 대해 종속적인 특성을 가질 때, 개체 B가 독자적으로는 존재할 수 없고 다른 개체 A의 존재 여부에 의존적이라면 개체 B가 개체 A에 종속되어 있다고 한다.
    • 강한 개체 : 다른 개체의 존재 여부를 결정하는 개체 (개체 A)
    • 약한 개체 : 다른 개체의 존재 여부에 의존적인 개체 (개체 B)

4.4 개체-관계 다이어그램

  • 개체-관계 모델을 이용해 현실 세계를 개념적으로 모델링한 결과물을 그림으로 표현한 것이다. E-R 다이어그램이라고도 한다.
  • 기본적으로 개체를 표현하는 사각형, 개체 간의 관계를 표현하는 마름모, 개체나 관계의 속성을 표현하는 타원과 각 요소들을 연결하는 선으로 구성된다.

4.5 논리적 데이터 모델

논리적 데이터 모델은 선택한 데이터베이스 관리 시스템에 따라 E-R 다이어그램으로 표현된 개념적 구조를 데이터베이스에 저장할 형태로 표현한 데이터베이스의 논리적인 구조다. 쉽게 말해, 논리적 데이터 모델은 논리적 데이터 모델링의 결과물이고, 사용자가 생각하는 데이터베이스의 모습 또는 구조다.

논리적 데이터 모델로 표현된 데이터베이스의 논리적 구조가 바로 데이터베이스 스키마다. 논리적 구조는 사용하는 데이터베이스 관리 시스템에 따라 달라진다.

  • 관계 데이터 모델 : 데이터베이스의 논리적 구조가 2차원 테이블 형태다.
  • 계층 데이터 모델 : 데이터베이스의 논리적 구조가 트리 형태다.
  • 네트워크 데이터 모델 : 데이터베이스의 논리적 구조가 그래프 형태다.

5. 관계 데이터 모델

5.1 관계 데이터 모델의 개념과 기본 용어

개념적 구조를 논리적 구조로 표현하는 논리적 데이터 모델 중 하나다. 관계 데이터 모델은 하나의 개체에 대한 데이터를 릴레이션 하나에 담아 데이터베이스에 저장한다. 이와 관련해 릴레이션, 속성과 투플, 도메인, 널, 차수, 카디널리티 등의 용어가 사용된다.

  • 릴레이션 : 하나의 개체에 관한 데이터를 2차원 테이블의 구조로 저장한 것
  • 속성(애트리뷰트)과 투플 : 릴레이션의 열과 행
    • 릴레이션, 속성, 투플은 파일 관리 시스템에서의 파일, 해당 파일의 필드, 해당 파일의 레코드에 대응하는 개념이다.
  • 도메인 : 하나의 속성이 가질 수 있는 모든 값의 집합
    • 프로그래밍 언어에서 데이터 타입을 도메인, 변수를 속성으로 생각하면 된다.
  • 널(null) : 아직 모르거나 해당되는 사항이 없음을 표현하는 특별한 값
    • 데이터베이스 관리 시스템마다 널 값을 표시하는 기호가 달라 보통 공백을 사용한다.
  • 차수 : 하나의 릴레이션에서 속성의 전체 개수
  • 카디널리티 : 하나의 릴레이션에서 투플의 전체 개수

5.2 릴레이션과 데이터베이스의 구성

릴레이션은 릴레이션 스키마와 릴레이션 인스턴스로 구성된다.

  • 릴레이션 스키마 : 릴레이션의 이름과 릴레이션에 포함된 모든 속성의 이름으로 정의하는 릴레이션의 논리적 구조
  • 릴레이션 인스턴스 : 어느 한 시점에 릴레이션에 존재하는 투플들의 집합
  • 데이터베이스 스키마 : 데이터베이스를 구성하는 릴레이션 스키마의 모음
  • 데이터베이스 인스턴스 : 데이터베이스를 구성하는 모든 릴레이션 인스턴스의 모음

5.3 릴레이션의 특성

  • 투플의 유일성 : 하나의 릴레이션에는 동일한 투플이 존재할 수 없다.
    • 모든 투플에는 다른 투플과 구별되는 유일한 특성이 있어야 한다.
    • 키(key) : 투플을 유일하게 구별하기 위해 선정되는 속성(또는 속성들의 모임)
  • 투플의 무순서 : 하나의 릴레이션에는 투플 사이의 순서는 무의미하다.
    • 투플 순서가 바뀐다고 다른 릴레이션이 될 수 없고, 순서와 상관없이 투플 내용이 같으면 동일한 릴레이션이다.
  • 속성의 무순서 : 하나의 릴레이션에서 속성 사이의 순서는 무의미하다.
    • 속성의 순서가 바뀌어도 다른 릴레이션이 될 수 없고, 순서와 상관없이 같은 속성들로 구성되어 있어야 동일한 릴레이션이다.
  • 속성의 원자성 : 속성 값으로 원자 값만 사용할 수 있다.

5.4 키

키는 릴레이션에서 투플들을 구별하는 역할을 하는 속성 또는 속성들의 집합이다.

특성

  • 유일성 : 한 릴레이션에서 모든 투플은 서로 다른 키 값을 가져야 함
  • 최소성 : 꼭 필요한 최소한의 속성들로만 키를 구성함

종류

  • 슈퍼키 : 유일성을 만족하는 속성 또는 속성들의 집합
    • 유일성 : 키가 갖추어야 하는 기본 특성으로, 하나의 릴레이션에서 키로 지정된 속성 값은 투플마다 달라야 한다는 의미다.
  • 후보키 : 유일성과 최소성을 만족하는 속성 또는 속성들의 집합
    • 최소성 : 꼭 필요한 최소한의 속성들로만 키를 구성하는 특성이다.
    • 슈퍼키 중에서 최소성을 만족하는 것이 후보키가 된다.
  • 기본키 : 후보키 중에서 기본적으로 사용하기 위해 선택한 키
    • 기본키를 선택할 때 고려할 기준
      • 널 값을 가질 수 있는 속성이 포함된 후보키는 기본키로 부적합하다.
      • 값이 자주 변경될 수 있는 속성이 포함된 후보키는 기본키로 부적합하다.
      • 단순한 후보키를 기본키로 선택한다.
        • 단순한 후보키 : 자릿수가 적은 정수나 단순 문자열인 속성으로 구성되거나, 구성하는 속성의 개수가 적은 후보키
  • 대체키 : 기본키로 선택되지 못한 후보키
  • 외래키 : 다른 릴레이션의 기본키를 참조하는 속성 또는 속성들의 집합
    • 외래키가 다른 릴레이션의 기본키 외에 대체키를 참조하는 것도 가능하다. 다만 외래키는 다른 릴레이션의 기본키를 참조하는 경우가 많다.
    • 기본키가 아니면 유일한 투플을 구별하기 어렵기 때문에 외래키는 반드시 다른 릴레이션의 기본키를 참조해야 한다.
    • 외래키를 가진 릴레이션을 '참조하는 릴레이션'이라 하고, 기본키를 가진 릴레이션을 '참조되는 릴레이션'이라 한다.
    • 외래키가 되는 속성과 기본키가 되는 속성의 이름은 달라도 되지만, 외래키 속성의 도메인과 참조되는 키본키 속성의 도메인은 반드시 같아야 한다.
    • 하나의 릴레이션에는 외래키가 여러 개 존재할 수 있다.
    • 외래키를 기본키로 사용할 사용할 수도 있고 외래키를 포함하여 기본키를 구성할 수도 있다.
    • 참조하는 릴레이션과 참조되는 릴레이션이 같을 수 있다. 즉, 외래키 자신이 속한 릴레이션의 기본키를 참조하도록 외래키를 정의할 수도 있다.
    • 외래키는 기본키를 참조하지만 기본키가 아니기 때문에 널 값을 가질 수 있다.

5.5 관계 데이터 모델의 제약조건

관계 데이터 모델에서 정의하고 있는 기본 제약 사항은 키와 관련한 무결성 제약조건이다. 데이터를 정확하고 유효하게 유지하는 무결성을 보장해야 된다는 규칙이다. 개체 무결성 제약조건과 참조 무결성 제약조건이 있다.

👉 무결성 : 데이터에 결함이 없는 상태, 즉 데이터가 정확하고 유효하게 유지된 상태

  • 개체 무결성 제약조건 : 기본키를 구성하는 모든 속성은 널 값을 가질 수 없다.
    • 기본키를 구성하는 속성 전체나 일부가 널 값이 되면 투플의 유일성을 판단할 수 없어 기본키의 본래 목적을 상실하게 된다.
    • 보통 데이터베이스 관리 시스템이 자동으로 수행하므로 새로운 릴레이션을 생성할 때마다 기본키를 어떤 속성들로 구성할 것인지 데이터베이스 관리 시스템에 알려주면 된다.
  • 참조 무결성 제약조건 : 외래키는 참조할 수 없는 값을 가질 수 없다.
    • 외래키가 자신이 참조하는 릴레이션의 기본키와 상관이 없는 값을 가지게 되면 두 릴레이션을 연관시킬 수 없으므로 외래키 본래의 의미가 없어진다.
    • 외래키가 참조 가능한 값만 가져야 하지만, 널 값을 가진다고 해서 위반한 것으로 판단해서는 안 된다.
    • 이 또한 데이터베이스 관리 시스템이 자동으로 수행하므로 새로운 릴레이션을 생성할 때마다 어떤 속성들이 외래키인지, 어떤 릴레이션의 기본키를 참조하면 되는지, 참조 무결성 제약조건을 위반하게 되는 경우에 원하는 처리 방법을 데이터베이스 관리 시스템에 알려주면 된다.

6. 관계 데이터 연산

6.1 데이터 모델

데이터 모델 = 데이터 구조 + 제약조건 + 연산

6.2 관계 데이터 연산

관계 데이터 모델에서의 연산은 원하는 데이터를 얻기 위해 릴레이션에 필요한 처리 요구를 수행하는 것으로, 데이터베이스 시스템의 구성 요소 중 데이터 언어의 역할을 한다. 대표적인 관계 데이터 연산으로 관계 대수와 관계 해석이 있는데, 이 둘은 기능과 표현력 모두에서 능력이 동등하다.

  • 관계 대수 : 원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술하는 절차 언어다.
  • 관계 해석 : 원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술하는 비절차 언어다.

📌 데이터에 대한 처리 요구를 일반적으로 질의(query)라 한다.

6.3 관계 대수

관계 대수는 원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술한 언어로, 간단히 말해 릴레이션을 처리하는 연산자들의 모임이다.

  • 수학의 집합 관련 연산자를 차용한다.
  • 관계 대수의 피연산자인 릴레이션에 연산자를 적용한 결과도 릴레이션이라는 폐쇄 특성이 있다.
  • 관계 대수에 속하는 대표적인 연산자 8개는 특성에 따라 일반 집합 연산자와 순수 관계 연산자로 분류할 수 있다.

6.4 일반 집합 연산자

릴레이션이 투플의 집합이라는 개념을 이용하는 연산자로, 두 릴레이션을 대상으로 연산을 수행한다. 합집합, 교집합, 차집합, 카티션 프로덕트가 있는데, 합집합, 교집합, 차집합은 피연산자인 두 릴레이션이 합병 가능해야 연산을 수행할 수 있다.

  • 합집합(∪) : 두 릴레이션의 합집합 투플을 구한다.
  • 교집합(∩) : 두 릴레이션의 교집합 투플을 구한다.
  • 차집합(-) : 두 릴레이션의 차집합 투플을 구한다.
  • 카티션 프로덕트(x) : 두 릴레이션의 모든 투플을 각각 연결하여 생성된 투플을 구한다.

📌 합병이 가능하기 위한 조건?

  • 두 릴레이션의 차수가 같다. 즉, 두 릴레이션은 속성 개수가 같다.
  • 2개의 릴레이션에서 서로 대응되는 속성의 도메인이 같다. 단, 도메인이 같으면 속성의 이름은 달라도 된다.

6.5 순수 관계 연산자

릴레이션의 구조와 특성을 이용하는 연산자다. 셀렉트, 프로젝트, 조인, 디비전이 있다.

  • 셀렉트(σ) : 릴레이션에서 조건을 만족하는 투플을 구한다.
  • 프로젝트(π) : 릴레이션에서 주어진 속성들의 값으로만 구성된 투플을 구한다.
  • 조인(⋈) : 공통 속성을 이용해 두 릴레이션의 투플들을 연결하여 생성된 투플을 구한다.
    • 자연 조인(⋈) : 두 릴레이션에서 조인 속성 값이 같은 투플끼리만 연결하여 생성된 새로운 투플로 구성된다.
    • 세타 조인(θ-join) : 주어진 조인 조건을 만족하는 두 릴레이션의 모든 투플을 연결한 새로운 투플로 결과 릴레이션을 구성한다.
  • 디비전(÷) : 나누어지는 릴레이션에서 나누는 릴레이션의 모든 투플과 관련이 있는 투플을 구한다.

6.6 확장된 관계 대수 연산자

  • 세미 조인(⋉) : 조인 속성으로 프로젝트한 릴레이션을 이용해 조인(자연 조인)한다.
  • 외부 조인(⋈+) : 결과 릴레이션에 자연 조인 연산에서 제외되었던 모든 투플을 포함시킨다.

6.7 관계 해석

원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술하는 언어다.

  • 수학의 프레디킷 해석에 기반을 둔다.
  • 투플 관계 해석과 도메인 관계 해석으로 분류된다.

7. 데이터베이스 언어 SQL

7.1 SQL

관계 데이터베이스를 위한 표준 질의어다.

  • 사용자가 처리를 원하는 데이터가 무엇인지만 제시하고 데이터를 어떻게 처리해야 하는지를 언급할 필요가 없어 비절차적 데이터 언어의 특징을 띤다.
  • 기능에 따라 데이터 정의어, 데이터 조작어, 데이터 제어어로 나눈다.
    • 데이터 정의어 : 테이블을 생성하고 변경, 제거하는 기능을 제공한다.
    • 데이터 조작어 : 테이블에 새 데이터를 삽입하거나, 테이블에 저장된 데이터를 수정, 석제, 검색하는 기능을 제공한다.
    • 데이터 제어어 : 보안을 위해 데이터에 대한 접근 및 사용 권한을 사용자별로 부여하거나 취소하는 기능을 제공하는 언어다. 데이터베이스 관리자가 주로 사용한다.

7.2 SQL의 데이터 정의 기능

  • SQL 문의 일반적인 특징
    • 모든 SQL 문은 세미콜론(;)으로 문장 끝을 표시한다.
    • SQL 문에 사용되는 CREATE TABLE, NOT NULL 과 같은 키워드는 대소문자를 구분하지 않는다.
  • SQL의 데이터 정의 기능
    • 테이블 생성 : CREATE TABLE
    • 테이블 변경 : ALTER TABLE
    • 테이블 삭제 : DROP TABLE

1. 테이블 생성

  • 1 : 테이블을 구성하는 각 속성의 이름과 데이터 타입, 기본적인 제약 사항을 정의한다.
  • 2 : 기본키로 테이블에 하나만 존재할 수 있다.
  • 3 : 대체키로 테이블에 여러 개 존재할 수 있다.
  • 4 : 외래키로 테이블에 여러 개 존재할 수 있다.
  • 5 : 데이터 무결성을 위한 제약조건으로 테이블에 여러 개 존재할 수 있다.
  • []로 표시한 항목은 생략이 가능하다.

1.1 속성의 정의

  • 테이블을 구성하는 각 속성의 데이터 타입을 선택한 후에는 속성의 널 값 허용 여부와 기본값 필요 여부를 결정해야 한다.
  • 키워드
    • NOT NULL
      • 널 값을 허용하지 않으려면 속성을 정의할 때 속성의 이름과 데이터 타입 다음에 NOT NULL 키워드를 포함해야 한다.
      • 기본키로 지정한 속성은 굳이 NOT NULL을 표기하지 않아도 자동으로 NOT NULL 특성을 갖는다.
      • ex) 고객아이디 VARCHAR(20) NOT NULL
    • DEFAULT
      • 속성에 기본 값을 지정해두지 않으면 해당 속성에 널 값이 기본으로 저장된다.
      • DEFAULT 키워드를 사용해 기본 값을 명확히 지정해두면 이 기본 값이 저장된다.
      • 숫자 데이터는 그대로 표현, 문자열이나 날짜 데이터는 작은 따옴표로 묶어주어야 한다.
        작은 따옴표로 묶인 문자열은 대소문자를 구분한다.
      • ex) 적립금 INT DEFAULT 0, 담당자 VARCHAR(10) DEFAULT '방경아'

1.2 키의 정의

  • CREATE TABLE 문으로 테이블을 정의할 때는 기본키, 대체키, 외래키를 지정할 수 있다.
  • 기본키 : PRIMARY KEY 키워드
    • 모든 테이블에서 기본키는 반드시 하나만 지정할 수 있고, 여러 개의 속성으로 구성할 수도 있다.
    • ex) PRIMARY KEY(고객아이디), PRIMARY KEY(주문고객, 주문제품)
  • 대체키 : UNIQUE 키워드
    • 대체키로 지정된 속성의 값은 테이블에서 중복되면 안 되고 유일성을 가져야 한다.
    • 널 값을 가질 수 있고, 한 테이블에서 여러 개 지정할 수 있다.
    • ex) UNIQUE(고객이름)
  • 외래키 : FOREIGN KEY 키워드
    • 외래키가 어떤 테이블의 무슨 속성을 참조하는지 REFERENCES 키워드 다음에 명확히 제시해야 한다.
    • 참조되는 테이블에서 투플을 삭제하거나 변경할 때 처리하는 방법을 선택할 수 있다.
      • CREATE TABLE 문을 작성할 때 지정하면 되고, 기본 값은 ON DELETE NO ACTION이다.
      • ON DELETE NO ACTION : 투플을 삭제하지 못하게 한다.
      • ON DELETE CASCADE : 관련 투플을 함께 삭제한다.
      • ON DELETE SET NULL : 관련 투플의 외래키 값을 NULL로 변경한다.
      • ON DELETE SET DEFAULT : 관련 투플의 외래키 값을 미리 지정한 기본 값으로 변경한다.
    • 참조되는 테이블에서 투플이 변경될 때도 처리하는 방법을 선택할 수 있다.
      • CREATE TABLE 문을 작성할 때 지정하면 되고, 기본 값은 ON UPDATE NO ACTION이다.
      • ON UPDATE NO ACTION : 투플을 변경하지 못하도록 한다.
      • ON UPDATE CASCADE : 관련 투플에서 외래키 값을 함께 변경한다.
      • ON UPDATE SET NULL : 관련 투플의 외래키 값을 NULL로 변경한다.
      • ON UPDATE SET DEFAULT : 관련 투플의 외래키 값을 미리 지정한 기본 값으로 변경한다.
    • ex) FOREIGN KEY(소속부서) REFERENCES 부서(부서번호) ON DELETE CASCADE ON UPDATE CASCADE

1.3 데이터 무결성 제약조건의 정의

  • CREATE TABLE 문으로 테이블을 정의할 때 CHECK 키워드를 사용해 특정 속성에 대한 제약조건을 지정할 수 있다.
  • 테이블에 새로운 투플을 삽입하거나 기존 투플을 수정할 때도 이 제약조건을 반드시 지켜야 한다.
  • CHECK 키워드를 사용해 지정한 제약조건에 CONSTRAINT 키워드와 함께 고유의 이름을 부여할 수도 있다.
  • ex) CHECK(재고량>=0 AND 재고량<=10000), CONSTRAINT CHK_CPY CHECK(제조업체 = '한빛제과')

7.3 SQL의 데이터 조작 기능

  • SQL의 데이터 조작 기능
    • 데이터 검색 : SELECT
    • 데이터 삽입 : INSERT
    • 데이터 수정 : UPDATE
    • 데이터 삭제 : DELETE

1. 데이터 검색

1.1 기본 검색

SELECT [ ALL | DISTINCT ] 속성_리스트
FROM 테이블_리스트;
  • 검색 속성의 이름과 검색 테이블의 이름을 콤마(,)로 구분하여 차례로 나열한다.
  • 테이블에 존재하는 모든 속성을 검색하려면 *를 사용한다.
  • SELECT 문의 수행 결과로 반환되는 결과 테이블에서는 동일한 투플이 중복될 수 있다.
  • ALL : 결과 테이블의 중복 허용, DISTINCT : 결과 테이블에서 투플의 중복 제거
  • AS : 결과 테이블에 출력되는 속성의 이름을 변경할 때, 생략 가능
  • ex) SELECT 제품명, 단가 AS 가격 FROM 제품;
  • 산술식을 이용한 검색
    • SELECT 키워드와 함께 산술식을 제시할 수 있다. 산술식은 속성의 이름과 +, -, *, / 등의 산술 연산자, 상수로 구성한다.
    • ex) SELECT 단가+500 AS "조정 단가" FROM 제품;

1.2 조건 검색 - WHERE

SELECT [ ALL | DISTINCT ] 속성_리스트
FROM 테이블_리스트
[ WHERE 조건 ];
  • WHERE 키워드와 함께 비교 연산자와 논리 연산자를 이용한 검색 조건을 제시한다.
  • 비교 연산자를 이용해 숫자뿐 아니라 문자나 날짜 값도 비교 가능하다. (작은 따옴표로 묶어야 한다.)
  • NULL 검색
    • IS NULL : 검색 조건에서 특정 속성의 값이 널 값인지를 비교할 때 사용한다.
    • IS NOT NULL : 특정 속성의 값이 널 값이 아닌지를 비교할 때 사용한다.
  • 문자열 부분 검색 : LIKE
    • 검색 조건을 부분적으로만 알고 있다면 = 대신 LIKE 키워드를 사용한다.
    • LIKE 키워드와 함께 사용할 수 있는 기호
      • % : 0개 이상의 문자 (문자의 내용과 개수는 상관 없음)
      • _ : 1개의 문자 (문자의 내용은 상관 없음)

1.3 정렬 검색 - ASC, DESC

SELECT [ ALL | DISTINCT ] 속성_리스트
FROM 테이블_리스트
[ WHERE 조건 ]
[ ORDER BY 속성_리스트 [ ASC | DESC ] ];
  • ORDER BY 키워드와 함께 정렬 기준이 되는 속성을 지정한다.
  • 오름차순 정렬이면 ASC, 내림차순 정렬이면 DESC로 표현한다. 기본 값은 오름차순이다.

1.4 집계 함수를 이용한 검색

  • 특정 속성 값을 통계적으로 계산한 결과를 검색하기 위해 집계 함수를 이용할 수 있다.
  • 집계 함수 종류 : 개수(COUNT), 최댓값(MAX), 최솟값(MIN), 합계(SUM), 평균(AVG)
    • SUM, AVG 함수는 숫자 데이터 타입의 속성에만 적용할 수 있다.
  • 집계 함수 주의 사항
    • 널인 속성 값은 제외하고 계산한다.
    • WHERE 절에서는 사용할 수 없고, SELECT 절이나 HAVING 절에서만 사용할 수 있다.
  • 집계 함수를 이용해 계산된 결과 값을 출력할 때는 AS 키워드를 사용해 새 이름을 부여해주는 것이 좋다.

1.5 그룹별 검색 - GROUP BY, HAVING

SELECT [ ALL | DISTINCT ] 속성_리스트
FROM 테이블_리스트
[ WHERE 조건 ]
[ GROUP BY 속성_리스트 [ HAVING 조건 ] ]
[ ORDER BY 속성_리스트 [ ASC | DESC ] ];
  • 테이블에서 특정 속성의 값이 같은 투플을 모아 그룹을 만들고, 그룹별로 검색을 하기 위해 GROUP BY 키워드를 사용한다.
  • GROUP BY 키워드와 함께 그룹을 나누는 기준이 되는 속성을 지정한다.
  • 그룹에 대한 조건을 추가하려면 HAVING 키워드와 함께 작성한다.
  • 그룹별로 검색할 때는 그룹을 나누는 기준이 되는 속성을 SELECT 절에도 작성하는 것이 좋다.
  • 그룹별로 검색할 때는 집계 함수나 GROUP BY 절에 있는 속성 외의 속성은 SELECT 절에 사용할 수 없다.

1.6 여러 테이블에 대한 조인 검색

  • 조인 검색을 하려면 테이블을 연결해주는 속성이 필요하고 이 속성을 조인 속성이라 한다.
  • 테이블을 연결하려면, 조인 속성의 이름은 달라도 도메인은 반드시 같아야 한다.
  • 일반적으로 테이블의 관계를 나타내는 외래키를 조인 속성으로 이용한다.
  • 조인 검색을 위한 SQL 문은 FROM 절에 검색에 필요한 모든 테이블을 나열하고, WHERE 절에는 조인 속성의 값이 같아야 함을 의미하는 조인 조건을 제시한다.
  • 여러 테이블을 이용하는 조인 검색에서 테이블의 이름과 속성의 이름은 . 기호로 연결한다.
  • 테이블 이름이 길면 AS 키워드를 이용해 별명을 부여할 수 있다. 테이블에 별명을 부여하기 위한 AS 키워드는 생략할 수 있다.

1.7 부속 질의문을 이용한 검색

  • 다른 SELECT 문 안에 들어 있는 SELECT 문을 부속 질의문 또는 서브 질의문이라 하고, 다른 SELECT 문을 포함하는 SELECT 문을 상위 질의문 또는 주 질의문이라 한다.
  • 부속 질의문은 괄호로 묶어 작성하고 ORDER BY 절을 사용할 수 없으며, 상위 질의문보다 먼저 수행된다.
  • 부속 질의문 종류
    • 단일 행 부속 질의문 : 하나의 행을 결과로 반환하는 질의문
      • 일반 비교 연산자를 사용할 수 있다.
    • 다중 행 부속 질의문 : 하나 이상의 행을 결과로 반환하는 질의문
      • IN, NOT IN : 부속 질의문의 결과 값 중 일치하는 것이 있으면 검색 조건이 참, 없으면 참
      • EXISTS, NOT EXISTS : 부속 질의문의 결과 값 중 하나라도 존재하면 검색 조건이 참, 존재하지 않으면 참
      • ALL : 부속 질의문의 결과 값 모두와 비교한 결과가 참이면 검색 조건을 만족
        (비교 연산자와 함께 사용)
      • ANY 또는 SOME : 부속 질의문의 결과 값 중 하나라도 비교한 결과가 참이면 검색 조건을 만족 (비교 연산자와 함께 사용)

2. 데이터의 삽입

  • INSERT 문을 이용해 투플을 삽입하는 방법
    • 테이블에 투플을 직접 삽입한다.
    • 부속 질의문을 이용해 투플을 삽입한다.

2.1 데이터 직접 삽입

INSERT
INTO 테이블_이름[(속성_리스트)]
VALUES (속성값_리스트);
  • INTO 절에서 속성 이름의 리스트는 생략할 수 있는데, 생략한 경우에는 테이블을 정의할 때 지정한 속성의 순서대로 VALUES 절의 속성 값이 삽입된다.
  • VALUES 절에 나열되는 속성 값은 문자나 날짜 타입의 데이터인 경우에는 작은따옴표로 묶어야 한다.

2.2 부속 질의문을 이용한 데이터 삽입

INSERT
INTO 테이블_이름[(속성_리스트)]
SELECT 문;

3. 데이터의 수정

UPDATE 테이블_이름
SET 속성_이름1 = 값1, 속성_이름2 = 값2, ...
[WHERE 조건];
  • UPDATE은 테이블에 저장된 투플에서 특정 속성의 값을 수정한다.
  • SET에서 지정한 대로 속성 값을 수정한다.
  • WHERE 절을 생략하면 테이블에 존재하는 모든 투플을 대상으로 한다.

4. 데이터의 삭제

DELETE
FROM 테이블_이름
[WHERE 조건];
  • DELETE은 WHERE 절에 제시한 조건을 만족하는 투플만 삭제한다.
  • WHERE을 생략하면 테이블에 존재하는 모든 투플을 삭제하여 빈 테이블이 된다.

7.4 SQL의 데이터 제어 기능

보안을 위해 사용자별로 데이터에 대한 접근 및 사용 권한을 부여하거나 취소하는 기능으로, 데이터베이스 관리자가 주로 사용한다.

7.5 뷰

다른 테이블을 기반으로 만든 가상 테이블이다. 일반 테이블과 달리 데이터를 실제로 저장하고 있지 않다. 물리적으로 존재하면서 실제로 데이터를 저장하는 일반 테이블과 달리, 뷰는 논리적으로만 존재한다. 뷰를 만드는 데 기반이 되는 물리적인 테이블을 기본 테이블이라 한다.

  • 뷰 생성 : CREATE VIEW
  • 뷰 삭제 : DROP VIEW

1. 뷰의 생성

CREATE VIEW 뷰_이름[(속성_리스트)]
AS SELECT 문
[WITH CHECK OPTION];
  • CREATE VIEW 명령어와 함께 새로 생성할 뷰의 이름을 제시한 후, 뷰를 구성하는 속성의 이름을 괄호 안에 나열한다.
    • 속성의 이름 리스트를 생략하면 SELECT 절에 나열된 속성의 이름을 그대로 사용한다.
  • AS 키워드와 함께 기본 테이블에 대한 SELECT 문을 제시한다.
    • SELECT 문은 생성하고자 하는 뷰의 정의를 담고 있으며, ORDER BY를 사용할 수 없다.
  • WITH CHECK OPTION은 생성한 뷰에 삽입이나 수정 연산을 할 때 SELECT 문에서 제시한 뷰의 정의 조건을 위반하면 수행되지 않도록 하는 제약조건을 의미한다.

2. 뷰의 활용

  • INSERT, SELECT, UPDATE, DELETE 문도 뷰를 대상으로 수행할 수 있다. 물론 뷰에 대한 연산도 기본 테이블에 수행되기 때문에 결과적으로는 기본 테이블이 변한다.
  • 검색 연산은 모든 뷰에 수행할 수 있지만 삽입, 수정, 삭제 연산은 허용되지 않는 뷰가 있다.
  • 변경이 불가능한 뷰의 중요한 특징
    • 공통점 : 기본 테이블에서 어떤 투플을 어떻게 변경해야 할지 명확히 제시하지 못하는 뷰는 변경이 허용되지 않는다.
    • 기본 테이블의 기본키를 구성하는 속성이 포함되어 있지 않은 뷰
    • 기본 테이블에 있던 애용이 아니라 집계 함수로 새로 계산된 내용을 포함하고 있는 뷰
    • DISTINCT 키워드를 포함하여 정의한 뷰
    • GROUP BY 절을 포함하여 정의한 뷰
    • 여러 개의 테이블을 조인하여 정의한 뷰
  • 뷰의 장점
    • 질의문을 좀 더 쉽게 작성할 수 있다.
    • 데이터의 보안 유지에 도움이 된다.
    • 데이터를 좀 더 편리하게 관리할 수 있다.

3. 뷰의 삭제

DROP VIEW 뷰_이름;
  • 뷰를 삭제하더라도 기본 테이블을 영향을 받지 않는다.
  • 만약 삭제할 뷰를 참조하는 제약조건이 존재한다면 삭제가 수행되지 않는다.

7.6 삽입 SQL

프로그래밍 언어로 작성한 응용 프로그램에 삽입하여 사용하는 SQL문으로, 커서라는 도구가 필요하다.

  • 커서 : 수행 결과로 반환된 행들을 한 번에 하나씩 가리키는 포인터
  • 커서가 필요 없는 삽입 SQL : CREATE TABLE / INSERT / DELETE / UPDATE / 행 하나를 결과로 반환하는 SELECT
  • 커서가 필요한 삽입 SQL : 여러 행을 결과로 반환하는 SELECT

8. 데이터베이스 설계

8.1 데이터베이스 설계의 과정

  • 데이터베이스 설계는 사용자의 다양한 요구 사항을 고려하여 데이터베이스를 생성하는 과정이다.

  • 품질 좋은 데이터베이스를 평가하는 기준

    • 데이터베이스를 실제로 사용하는 구성원들의 요구 사항을 만족하는지
    • 데이터의 일관성과 무결성을 유지하면서 사용자가 이해하기 쉽고 접근하기 편한지
  • 관계 데이터 모델을 기반으로 데이터베이스를 설계할 때는 E-R 모델과 변환 규칙을 이용한 설계정규화를 이용한 설계가 있다. 두 방법의 설계 결과물은 유사하기 때문에 상황에 따라 선택하면 된다.

    • E-R 모델과 릴레이션 변환 규칙을 이용한 설계 : 다음 5단계로 진행된다.
    • 정규화를 이용한 설계 : 이상 현상을 제거하면서 올바르게 설계해나가는 방법이다.

8.2 요구 사항 분석

데이터베이스에 대한 사용자의 다양한 요구 사항을 수집하고 분석하여, 개발할 데이터베이스의 용도를 파악해 요구 사항 명세서를 작성한다.

과정

  1. 데이터베이스를 사용할 주요 사용자의 범위를 결정한다.
  2. 해당 사용자가 조직에서 수행하는 업무를 분석한다.
    • 사용자의 업무와 관련해 필요한 데이터가 무엇이고, 그 데이터에 어떤 처리가 필요한지 등에 초점을 맞춰 요구 사항들을 수집하고 분석해야 한다.
    • 요구 사항을 수집하기 위해 사용자들과의 면담, 설문지 배포, 업무 관련 문서의 분석 등과 같은 방법이 주로 사용된다.
  3. 수집된 요구 사항을 다각도로 분석한 뒤 분석 결과를 요구 사항 명세서로 작성한다.

8.3 개념적 설계

요구 사항 명세서를 개념적 데이터 모델(개념적 스키마)로 표현한다.

📌 개념적 데이터 모델
개발에 사용할 DBMS의 종류에 독립적이면서, 중요한 데이터 요소와 데이터 요소 간의 관계를 표현할 때 사용한다.

  • 일반적으로 개념적 데이터 모델로 E-R 모델을 많이 사용한다.
  • E-R 모델은 중요한 데이터 요소와 데이터 요소 간의 관계를 E-R 다이어그램으로 표현한다.
  • E-R 모델을 데이터 모델로 사용한다면 사용자의 요구 사항을 분석한 결과를 E-R 다이어그램으로 표현하는 것이 개념적 설계 단계에서 수행하는 주요 작업이다.
  • 개념적 설계 단계에서 요구 사항 분석 단계의 결과물인 요구 사항 명세서를 개념적 데이터 모델로 변환하는 일을 개념적 모델링이라 한다.
  • E-R 다이어그램과 같이 개념적 데이터 모델로 표현한 결과물을 개념적 구조 또는 개념적 스키마라고 한다.

과정

요구 사항의 분석 결과를 E-R 모델을 이용해 개념적 모델링을 하기 위해선
1. 요구 사항 분석 단계의 결과물에서 개체를 추출하고, 각 개체의 주요 속성과 키 속성을 선별한다.

  • 개체는 저장할 만한 가치가 있는 중요 데이터를 지닌 사람이나 사물 등이먀, 개념적 모델링을 하는 데 가장 중요한 요소다.
  1. 개체와 속성을 추출하고 나면 개체 간의 관계를 결정한다.
  • 관계를 추출한 후에는 추출한 관계에 대한 매핑 카디널리티와 참여 특성을 결정한다.

    📌 매핑 카디널리티
    관계를 맺고 있는 두 개체에서, 각 개체 인스턴스가 고나계를 맺고 있는 상대 개체의 개체 인스턴스 개수를 의미한다.

    • 매핑 카디널리티를 기준으로 추출한 관계를 일대일(1:1), 일대다(1:n), 다대다(n:m) 중 하나로 분류한다.
    • 그리고 개체가 관계에 필수적으로 참여하고 있는 지 선택적으로 참여하고 있는지를 의미하는 참여 특성을 결정한다.
  1. 개체, 속성, 관계를 선별하는 작업이 모두 완료되면 그 결과를 E-R 다이어그램으로 표현한다.

8.4 논리적 설계와 릴레이션 스키마 변환 규칙

DBMS에 독립적인 개념적 스키마를 기반으로 하여 개발에 사용할 DBMS가 처리할 수 있는 데이터베이스의 논리적 구조를 설계한다.

  • 일반적으로 관계 데이터 모델을 많이 사용한다.
  • 관계 데이터 모델을 사용한다면 개념적 설계 단계에서 생성한 E-R 다이어그램을 릴레이션(테이블) 스키마로 변환하는 것이 논리적 설계 단계에서 수행하는 주요 작업이다.
  • 논리적 설계 단계에서 E-R 다이어그램을 릴레이션 스키마로 변환하는 작업을 논리적 모델링 또는 단순히 데이터 모델링이라 한다.
  • 논리적 데이터 모델로 표현된 결과물을 논리적 구조 또는 논리적 스키마라고 한다.

과정

다음 다섯 가지 릴레이션 변환 규칙에 따라 개념적 설계를 릴레이션 스키마(논리적 스키마)로 변환한다.

  • 규칙 1 : 모든 개체는 릴레이션으로 변환한다.
    • 개체의 이름은 릴레이션의 이름으로, 개체가 가지고 있는 속성은 릴레이션의 속성으로, 개체의 키 속성은 릴레이션의 키본키로 변환한다.
    • 복합 속성인 경우에는 복합 속성을 구성하고 있는 단순 속성만 릴레이션의 속성으로 변환한다.
  • 규칙 2 : 다대다(n:m) 관계는 릴레이션으로 변환한다.
    • 관계의 이름은 릴레이션의 이름으로, 관계의 속성도 릴레이션의 속성으로 변환한다.
    • 릴레이션들의 기본키를 관계 릴레이션에 포함시키고 외래키로 지정하고, 이 외래키들을 조합하여 관계 릴레이션의 기본키로 지정한다. 필요하다면 별도의 기본키를 지정할 수도 있다.
  • 규칙 3 : 일대다(1:n) 관계는 외래키로 표현한다.
    • 규칙 3-1 : 일반적인 일대다 관계는 외래키로 표현한다.
      • 일대다(1:n) 관계에서 1측 개체 릴레이션의 기본키를 가져와 n측 개체 릴레이션에 포함시키고 외래키로 지정한다.
      • 관계의 속성들도 n측 개체 릴레이션에 포함시킨다.
    • 규칙 3-2 : 약한 개체가 참여하는 일대다 관계는 외래키를 포함해서 기본키로 지정한다.
      • 일반 개체들이 참여하는 일대다 관계와 다른 점은, n측 개체 릴레이션이 가지고 있던 키 속성과 외래키 속성을 조합하여 기본키로 지정한다.
  • 규칙 4 : 일대일(1:1) 관계는 외래키로 표현한다.
    • 규칙 4-1 : 일반적인 일대일 관계는 외래키를 서로 주고받는다.
      • 릴레이션들이 서로의 기본키를 주고받아 이를 외래키로 지정한다.
      • 이때, 관계가 가지는 속성들은 관계에 참여하는 개체를 변환한 릴레이션에 모두 포함시킨다.
    • 규칙 4-2 : 일대일 관계에 필수적으로 참여하는 개체의 릴레이션만 외래키를 받는다.
      • 관계에 필수적으로 참여하는 개체에 해당하는 릴레이션이 선택적으로 참여하는 개체에 해당하는 릴레이션의 기본키를 받아 외래키로 지정한다.
      • 관계가 가지고 있는 속성들도 관계에 필수적으로 참여하는 개체에 해당하는 릴레이션에 함께 포함시킨다.
      • 일대일 관계를 맺는 두 개체가 모두 선택적으로 참여하는 경우에는 외래키를 포함시킬 릴레이션을 자유롭게 선택하면 된다.
    • 규칙 4-3 : 모든 개체가 일대일 관계에 필수적으로 참여하면 릴레이션 하나로 합친다.
      • 관계의 이름을 릴레이션의 이름으로, 관계에 참여하는 두 개체의 속성들도 관계 릴레이션에 모두 포함시킨다.
      • 두 개체 릴레이션의 키 속성을 조합하여 관계 릴레이션의 기본키로 지정한다.
  • 규칙 5 : 다중 값 속성은 릴레이션으로 변환한다.
    • 관계 데이터 모델의 릴레이션에서는 다중 값을 가지는 속성을 허용하지 않는다. 그러므로 다중 값 속성은 그 속성을 가지고 있는 개체에 해당하는 릴레이션이 아닌 별도의 릴레이션을 만들어 포함시킨다.
    • 새로 만들어진 릴레이션에는 다중 값 속성으로 표현된 속성뿐 아니라 그 속성을 가지고 있는 개체에 해당하는 릴레이션의 기본키를 가져와 포함시키고 이를 외래키로 지정한다.
    • 새로 만들어진 릴레이션의 이름은 자유롭게 정하고, 기본키는 다중 값 속성과 외래키를 조합하여 지정한다.
  • 기타 고려사항
    • 일대일, 일대다 관계도 릴레이션으로 변환할 수 있다. 특히, 속성이 많은 관계는 관계 유형에 상관없이 릴레이션으로 변환하는 것을 고려할 수 있다. 하지만 최대한 지양해야 한다.
      • 하지만 그럴 경우 생성되는 릴레이션의 개수가 많아져 DBMS의 부담이 커지게 된다. 그러므로 릴레이션의 개수가 불필요하게 늘어나지 않도록 일대일이나 일대다 관계는 릴레이션으로 변환하지 않는 것이 좋다.
    • 개체가 자기 자신과 관계를 맺는 순환 관계도 기본 규칙을 그대로 적용하면 된다.

8.5 물리적 설계와 구현

물리적 설계

하드웨어나 운영체제의 특성을 고려하여 필요한 인덱스 구조나 내부 저장 구조 등 물리적 구조를 설계한다.

  • 논리적 설계 단계에서 생성된 논리적 구조를 기반으로 물리적 구조를 설계한다.
    • 데이터베이스의 물리적 구조는 데이터베이스를 저장 장치에 실제로 저장하기 위한 내부 저장 구조와 접근 경로 등을 의미한다.
  • 물리적 설계 단계에서는 저장 장치에 적합한 저장 레코드와 인덱스의 구조 등을 설계하고, 저장된 데이터 인덱스에 빠르게 접근하게 할 수 있는 탐색 기법 등을 정의한다.
  • 데이터베이스를 실제로 구축할 컴퓨터 시스템의 저장 장치와 운영체제의 특성을 고려하여, 효율적인 성능을 지원하면서도 사용할 DBMS로 구현이 가능한 물리적인 구조를 설계하는 것이 물리적 설계 단계에서 수행하는 주요 작업이다.
  • 물리적 설계 단계에서는 응답 시간을 최소화하고 저장 공간을 효율적으로 활용하면서 데이터베이스 시스템의 처리 능력을 향상시킬 수 있도록 물리적 구조를 설계해야 한다.
  • 물리적 설계의 결과물인 물리적 구조를 내부 스키마 또는 물리적 스키마라고 한다.

구현

SQL 문을 작성항 후 이를 DBMS에서 실행하여 데이터베이스를 생성한다.

  • 이전 설계 단계의 결과물을 기반으로 DBMS에서 SQL로 작성한 명령문을 실행하여 데이터베이스를 실제로 생성한다.
    • 이때 사용되는 SQL 문은 테이블이나 인덱스 등을 생성할 때 사용되는 데이터 정의어(DDL)이다.

9. 정규화

데이터베이스를 잘못 설계하면 불필요한 데이터 중복이 발생하여 릴레이션에 대한 데이터의 삽입, 수정, 삭제 연산을 수행할 때 부작용이 발생할 수 있다. 이러한 부작용을 이상 현상이라 하는데, 이상 현상이라 한다.

9.1 이상 현상의 개념

  • 불필요한 데이터 중복으로 인해 발생하는 부작용들이다.
  • 함수 종속 관계 여러 개를 하나의 릴레이션에 표현하는 경우에 주로 발생한다.

9.2 이상 현상의 종류

  • 삽입 이상 : 새 데이터를 삽입하기 위해 불필요한 데이터도 함께 삽입해야 하는 문제다.
  • 갱신 이상 : 중복된 투플 중 일부 투플만 변경하여 데이터가 불일치하게 되는 모순의 문제다.
  • 삭제 이상 : 투플 삭제 시 꼭 필요한 데이터까지 함께 삭제되는 데이터 손실의 문제다.

정규화의 필요성

정규화는 이상 현상이 발생하지 않도록, 릴레이션을 관련이 있는 속성들로만 구성하기 위해 릴레이션을 분해하는 과정이다. 정규화 과정에서 고려해야 하는 속성들 간의 관련성을 함수적 종속성이라고 한다. 일반적으로 릴레이션에 함수적 종속성이 하나 존재하도록 정규화를 통해 릴레이션을 분해한다.

9.3 함수 종속

  • 하나의 릴레이션을 구성하는 속성들의 부분 집합을 X와 Y라 할 때, 어느 시점에서든 릴레이션 내의 모든 투플에서 하나의 X 값에 대한 Y 값이 항상 하나면 "X가 Y를 함수적으로 결정한다." 또는 "Y가 X에 함수적으로 종속되어 있다."라고 한다.
  • 함수 종속 관계는 X -> Y로 표현한다.(X는 결정자, Y는 종속자)

9.4 함수 종속 다이어그램

릴레이션 하나를 구성하는 속성들 간의 함수 종속 관계를 도식화하여 표현한 것이다.

함수 종속의 특징

  • 함수 종속 관계를 판단할 때, 릴레이션에서 속성 값은 계속 변할 수 있기 때문에 속성 자체가 가지고 있는 특성과 의미를 기반으로 판단해야 한다.
  • 일반적으로 투플을 유일하게 구별하는 기본키와 후보키는 그 특성 때문에 릴레이션을 구성하는 다른 모든 속성들을 함수적으로 결정한다. 하지만 기본키나 후보키가 아니더라도 함수 종속 관계에서 모두 결정자가 될 수 있다.
  • 종속의 종류
    • 완전 함수 종속 : 릴레이션에서 속성 집합 Y가 속성 집합 X에 함수적으로 종속되어 있지만, 속성 집합 X 전체에 종속된 것이지 일부분에 종속된 것이 아님을 의미한다.
    • 부분 함수 종속 : 속성 집합 Y가 속성 집합 X의 전체가 아닌 일부분에도 함수적으로 종속됨을 의미하므로, 부분 함수 종속 관계가 성립하려면 결정자가 여러 개의 속성들로 구성되어 있어야 한다.
    • 일반적으로 함수 종속이라고 하면 완전 함수 종속을 의미한다.

9.5 정규화

정규화는 함수 종속성을 이용하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해서, 이상 현상이 발생하지 않는 올바른 릴레이션으로 만들어나가는 과정이다.

9.6 정규형

정규형은 릴레이션이 정규화된 정도를 나타내는 기준이다.

  • 정규형의 종류

다음과 같은 4가지 기본 정규형을 주로 사용한다.

  • 제1정규형 : 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있다.
  • 제2정규형 : 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되어 있다.
    • 정규화 과정에서 수행되는 릴레이션의 분해는 무손실 분해여야 한다.
    • 자연 조인을 하면 원래의 릴레이션으로 다시 복원할 수 있도록, 정보의 손실 없이 릴레이션을 분해하는 것을 무손실 분해라고 한다.
  • 제3정규형 : 릴레이션이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 이행적으로 함수 종속되지 않았다.
    • 릴레이션을 구성하는 3개의 속성 집합 X, Y, Z에 대해 함수 종속 관계 X -> Y와 Y -> Z가 존재하면 논리적으로 X -> Z가 성립한다. 이때 속성 집합 Z가 속성 집합 X에 이행적으로 함수 종속되었다고 한다.
  • 보이스/코드 정규형 : 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키다.
  • 제4정규형 : 릴레이션이 보이스/코드 정규형을 만족하면서, 함수 종속이 아닌 다치 종속을 제거해야 한다.
  • 제5정규형 : 릴레이션이 제4정규형을 만족하면서 후보키를 통하지 않는 조인 종속을 제거해야 한다.

10. 회복과 병행 제어

10.1 트랜잭션의 개념

트랜잭션은 하나의 작업을 수행하기 위해 필요한 데이터베이스 연산들을 모아놓은 것으로, 데이터베이스에서의 논리적인 작업의 단위다.
트랜잭션은 데이터베이스에 장애가 발생했을 때 데이터를 복구하는 작업의 단위도 된다.

10.2 트랜잭션의 특성

트랜잭션이 성공적으로 처리되어 데이터베이스의 무결성과 일관성이 보장되려면 네 가지 특성을 꼭 만족해야 한다.

  • 원자성(Actomicity) : 트랜잭션의 연산이 모두 정상적으로 수행되거나 하나도 수행되지 않아야 한다.
  • 일관성(Consistency) : 트랜잭션이 수행된 후에도 데이터베이스가 일관된 상태를 유지해야 한다.
  • 격리성(Isolation) : 수행 중인 트랜잭션이 완료될 때까지 다른 트랜잭션들이 중간 연산 결과에 접근할 수 없다.
  • 지속성(Durability) : 트랜잭션의 수행이 완료된 후에 데이터베이스에 반영한 결과는 영구적이어야 한다.

트랜잭션의 특성을 지원하는 DBMS의 기능

10.3 트랜잭션의 연산

  • commit 연산 : 트랜잭션이 성공적으로 수행되었음을 선언(작업 완료)
    • 트랜잭션을 구성하는 모든 연산이 정상적으로 처리되면 commit 연산의 실행을 통해 트랜잭션의 수행이 성공적으로 완료되었음을 선언하고 트랜잭션이 수행한 최종 결과를 데이터베이스에 반영한다.
    • commit 연산이 실행된 후에 트랜잭션의 수행 결과가 데이터베이스에 반영되어 데이터베이스가 일관된 상태를 지속적으로 유지하게 된다.
  • rollback 연산 : 트랜잭션을 수행하는 데 실패했음을 선언(작업 취소)
    • 트랜잭션이 수행되는 도중에 장애가 발생하여 일부 연산이 처리되지 못한 상황에서는 rollback 연산을 실행하여 트랜잭션의 수행이 실패했음을 선언한다. 그리고 데이터베이스를 트랜잭션 수행 전의 일관된 상태로 되돌린다.
    • rollback 연산이 실행되면 트랜잭션이 지금까지 실행한 연산의 결과가 취소되고 트랜잭션이 수행되기 전의 상태로 돌아간다.

10.4 트랜잭션의 상태

  • 활동 상태 : 트랜잭션이 수행을 시작하여 현재 수행 중인 상태다.
    • 활동 상태인 트랜잭션은 상황에 따라 부분 완료 상태나 실패 상태가 된다.
  • 부분 완료 상태 : 트랜잭션의 마지막 연산이 실행을 끝낸 직후의 상태다.
    • 트랜잭션의 모든 연산의 처리가 끝났지만 트랜잭션이 수행된 최종 결과를 데이터베이스에 아직 반영하지 않은 상태다.
    • 부분 완료 상태의 트랜잭션은 상황에 따라 오나료 상태나 실패 상태가 될 수 있다.
  • 완료 상태 : 트랜잭션이 성공적으로 완료되어 commit 연산을 실행한 상태다.
    • 트랜잭션이 완료 상태가 되면 트랜잭션이 수행한 최종 결과를 데이터베이스에 반영하고, 데이터베이스가 새로운 일관된 상태가 되면서 트랜잭션이 종료된다.
  • 실패 상태 : 장애가 발생하여 트랜잭션의 수행이 중단된 상태다.
  • 철회 상태 : 트랜잭션의 수행 실패로 rollback 연산을 실행한 상태다.
    • 트랜잭션이 철회 상태가 되면 지금까지 실행한 트랜잭션의 연산을 모두 취소하고 트랜잭션이 수행되기 전의 데이터베이스 상태로 되돌리면서 트랜잭션이 종료된다.
    • 철회 상태로 종료된 트랜잭션은 상황에 따라 다시 수행되거나 폐기된다.
      • 다시 수행 : 트랜잭션의 내부 문제가 아닌, 하드웨어 이상이나 소프트웨어의 오류로 트랜잭션의 수행이 중단되고 철회 상태가 된 경우
      • 폐기 : 트랜잭션이 처리하려는 데이터가 데이터베이스에 존재하지 않거나 트랜잭션의 논리적인 오류가 원인인 경우

전체 과정

  1. 트랜잭션이 수행되기 시작하면 활동 상태가 된다.
  2. 활동 상태의 트랜잭션이 마지막 연산을 처리하고 나면 부분 완료 상태가 된다.
  3. 부분 완료 상태의 트랜잭션이 commit 연산을 실행하면 완료 상태가 된다.
  4. 활동 상태나 부분 완료 상태에서 여러 원인으로 인해 더는 정상적인 수행이 불가능하게 되면 트랜잭션은 실패 상태가 된다.
  5. 실패 상태의 트랜잭션은 rollback 연산의 실행으로 철회 상태가 된다.
  6. 트랜잭션이 완료 상태이거나 철회 상태가 되면 트랜잭션이 종료된 것으로 판단한다.
profile
🚀 백엔드 2년차 개발자입니다 🚀 성장의 즐거움으로 아자자자!🤣

0개의 댓글