본문 바로가기
KAIST/Database

관계형 데이터베이스 모델링 Relational Database Modeling

by 나비스 2024. 6. 25.

 

데이터베이스 개요

  • 데이터베이스: 관련된 데이터를 담고 있는 파일들의 모음
  • DBMS(데이터베이스 관리 시스템): 데이터베이스를 관리하는 소프트웨어
    • 새로운 데이터베이스를 생성하고 스키마(데이터의 논리적 구조)를 지정하는 기능 제공
    • 사용자가 쿼리 언어를 사용하여 데이터를 조회하고 수정할 수 있게 함
    • 대용량 데이터를 저장할 수 있음
    • 오류, 실패 또는 의도적인 악용으로부터 데이터베이스를 복구할 수 있음
    • 여러 사용자가 동시에 데이터에 접근할 수 있게 함

2. 데이터의 관계형 모델

2.1 데이터 모델 개요

  1. 데이터를 설명하는 표기법
  2. 구성 요소:
    1. 데이터 구조: 개념 모델 (물리 모델보다)
    2. 데이터 작업: 수행 가능한 제한된 작업 집합
      1. 쿼리: 정보를 조회하는 작업
      2. 수정: 데이터베이스를 변경하는 작업. 효율적이고 쉬워야 함
    3. 데이터 제약 조건: 데이터에 대한 제한

2.1.2 중요한 데이터 모델들

대부분의 DBMS관계형

NoSQL 키-값
NoSQL 그래프
NoSQL 문서(반구조적)
NoSQL 컬럼-패밀리
기계 학습 배열 / 행렬
Obsolete 계층형
구식 네트워크

2.1.3 관계형 모델 개요

  1. 구조: 테이블. 주 메모리에 저장되지 않고 디스크에 저장됨
  2. 작업: 관계 대수
  3. 제약 조건

2.1.4 반구조적 모델 개요 (더 유연하지만 쿼리는 느림)

  1. 구조: 트리 또는 그래프. 계층적으로 중첩된 태그 요소들
  2. 작업: 경로를 따르는 것과 관련됨
  3. 제약 조건: 태그와 관련된 값의 유형과 관련됨
  4. 키-값 모델 (더 유연하지만 쿼리가 불가능)
    1. 구조: 쌍. 키는 문자열이나 정수. 값은 모든 데이터 덩어리일 수 있음
    2. 작업: get(key), put(key, value)
    3. 제약 조건

2.2 관계형 모델의 기본 개념

  1. 속성(열, 필드): 데이터를 포함하는 이차원 테이블
  2. 스키마: 릴레이션 이름과 속성의 집합
  3. 데이터베이스 스키마: 데이터베이스의 릴레이션에 대한 스키마 집합
  4. 튜플(행, 레코드): 각 속성에 하나의 구성 요소를 가짐
  5. 도메인: 특정한 원시 유형(정수, 문자열). 배열, 집합, 리스트처럼 구성 요소로 나눌 수 있는 유형은 될 수 없음
  6. 릴레이션의 동등한 표현
    1. 릴레이션은 튜플의 집합임 (리스트가 아님)
    2. 스키마는 속성의 집합임 (리스트가 아님)
    3. → 릴레이션의 튜플이나 속성의 순서는 중요하지 않음
    4. 질문: 이 릴레이션을 나타내는 방법은 몇 가지가 있을까? 4개의 속성과 3개의 튜플 = 4! * 3! = 144
  7. 릴레이션 인스턴스
    1. 릴레이션은 정적이지 않음
      1. 튜플은 삽입, 삭제 또는 업데이트될 수 있음
      2. 스키마도 변경될 수 있지만 이는 비용이 많이 듦
    2. 인스턴스: 릴레이션의 튜플 집합
  8. 릴레이션의 키: 레코드를 고유하게 식별하는 속성의 집합
    1. 기본 키: 중복 값 없음, 하나만 존재
    2. 대체 키: 둘 이상의 속성 조합
    3. 외래 키: 다른 릴레이션의 레코드의 키 값인 속성

2.3 SQL에서 관계 스키마 정의하기

  1. 선언적. 1) DDL 데이터 정의 언어를 사용한 데이터베이스 스키마 선언 2) DML 데이터 조작 언어를 사용한 데이터베이스 쿼리 및 수정 지원
  2. SQL의 관계
    1. 테이블: 수정 및 쿼리 가능
    2. 뷰: 계산에 의해 정의된 관계. 저장되지 않고 필요할 때 구조화됨
    3. 임시 테이블: 쿼리 및 수정을 위해 SQL 프로세서에 의해 생성됨. 사용 후 버려지며 저장되지 않음
  3. 데이터 유형
    1. CHAR(n), VARCHAR(n)
    2. BIT(n), BIT VARYING(n)
    3. BOOLEAN (TRUE, FALSE, UNKNOWN)
    4. INT, SHORTINT
    5. FLOAT, REAL, DOUBLE PRECISION, DECIMAL(n, d), DOUBLE(p, s): p는 소수점 양쪽의 모든 자리 수의 최대값, s는 소수점 이하 자리 수의 최대값, 선택적
    6. DATE, TIME
  4. 간단한 테이블 선언
CREATE TABLE Movies(
	title CHAR(100),
	year INT,
	length INT,
	genre CHAR(10),
	studioName CHAR(30),
	producer INT
);
CREATE TABLE MovieStar(
	name CHAR(30),
	address VARCHAR(30),
	gender CHAR(1),
	birthdate DATE
);

 

5. 관계 스키마 수정

DROP TABLE R;

ALTER TABLE MovieStar ADD phone CHAR(16);
# 기존 튜플은 phone 속성에 대해 NULL 값을 가짐

ALTER TABLE MovieStar DROP birthdate;

 

6. 기본 값

CREATE TABLE MovieStar(
	name CHAR(30),
	address VARCHAR(30),
	gender CHAR(1) DEFAULT '?',
	birthdate DATE DEFAULT DATE '0000-00-00'
);

ALTER TABLE MovieStar ADD phone CHAR(16) DEFAULT 'unlisted';

 

7. 선언

  1. PRIMARY KEY 기본키
# 하나의 속성을 키로 선언
CREATE TABLE MovieStar(
	name CHAR(30) PRIMARY KEY,
	address VARCHAR(30),
	gender CHAR(1),
	birthdate DATE
);

# 별도의 선언으로 여러 속성을 키로 지정
CREATE TABLE MovieStar(
	name CHAR(30),
	address VARCHAR(30),
	gender CHAR(1),
	birthdate DATE,
	PRIMARY KEY(name, address)
);

 

 

     2. FOREIGN KEY 외래키

CREATE TABLE Studio(
	name CHAR(30) PRIMARY KEY,
	address VARCHAR(255),
	presidentCert INT,
	FOREIGN KEY (presidentCert) REFERENCES MovieExec(cert)
);
 

     3. INDEX 인덱스

SELECT *
FROM Movies
WHERE year=2008;

CREATE INDEX YearIndex ON Movies(year);
DROP INDEX YearIndex;

 

    4. Tuple 튜플

#------------------------------------

# 삽입
INSERT INTO Movies(title, year, length, genre, studio)
VALUES ('Ponyo', 2008, 103, 'anime', 'Ghibli');


#------------------------------------

# 삭제
DELETE FROM Movies
WHERE year >= 2008
AND length > 100
AND genre = 'anime';


#------------------------------------

# 업데이트
UPDATE Movies
SET length = 110, Producer = 123
WHERE title = 'Ponyo'
AND year = 2008 ;


#------------------------------------