DB-3장 : 관계형 데이터베이스

관계형 데이터베이스모델이란 무엇인가요?

  • 데이터베이스에서 가장 널리 쓰이는 모델이에요
  • 엑셀처럼 표(table) 형태로 데이터를 저장하고 관리해요.
  • 각 표는 행(row)열(column) 로 구성돼요.

Relational Database 의 구성요소

  • Relational database : relations 의 세트이다.
  • Relation : 아래 2가지로 이뤄져있다.
  • Schema
    • relation의 이름과 열의 이름과 타입을 정의한다.
    • ex) Students(sid:string, name:string, login:string, age:integer, gpa:real)
  • Instance
    • 행과 열로 이루어진 표다.
    • 행 혹은 튜플의 집합으로 생각할 수 있다.
  • cardinality(기수) : Rows. 행의 갯수.
    • 즉, 세트가 되는 데이터의 갯수입니다.
    • 위의 예시에서는 표에 학생이 몇명들어있느냐. 가 되겠네요
  • field : 열
  • Degree (or) Arity : 열의 갯수
  • Tuple(튜플) : 테이블의 한 행(row) 을 뜻하는 데이터 묶음

관계형 쿼리 언어

  • 관계형 모델의 진짜 힘은, 사용자가 ‘무엇을 원하냐(What)’만 말하면 DB가 ‘어떻게 할지(How)’를 알아서 최적으로 처리해 준다는 점이다.

sid

name

login

age

gpa

53666

Jones

jones@cs

18

3.4

53688

Smith

smith@ee

18

3.2

ex) SELECT * FROM Students WHERE age=18;

이렇게 하면 저거 두개 다 가져오겠지.

SELECT S.name, S.login 으로 저 위에 * 부분을 바꿔주면, 이름이랑 login 만 가져올거임.

  • JOIN 이란
    • 두 개(혹은 그 이상)의 릴레이션(테이블) 공통된 속성(attribute) 을 기준으로 하나로 결합(join) 하는 연산이다.
  • 옛날 형태의 join

SELECT S.name, E.cid
FROM Students S, Enrolled E
WHERE S.sid = E.sid AND E.grade = "A"

  • 요즘식 join으로 바꾸면

SELECT S.name, E.cid
FROM Students S
JOIN Enrolled E ON S.sid = E.sid
WHERE E.grade = 'A';

DDL (Data Definition Language)

SQL 에서 relation 만들기 - CREATE TABLE

  • CREATE TABLE [테이블명] ([컬럼명] [타입], ...);
  • ex)
CREATE TABLE Students
(sid CHAR(20),
name CHAR(20),
login CHAR(10),
age INTEGER,
gpa REAL);

Relation 삭제 및 변경하기

  • DROP TABLE [테이블 명];
    • 테이블 자체를 삭제
  • ALTER TABLE [테이블명] ADD COLUMN [컬럼명][컬럼타입];
    • 기존 테이블 스키마 수정 (열 추가 or 수정)
    • DROP COLUMN, ALTER COLUMN 도 있다.

DML (Data Manipulation Language)

TUPLE 더하거나 삭제하기

  • INSERT INTO [테이블명] ( [컬럼명], ...) VALUES ( [컬럼값]...);
  • DELETE FROM [테이블명] [별칭] WHERE [별칭].[컬럼명] [조건];
    • WHERE 절이 없으면 모두 삭제됨.

update랑 select도 있는데

Integrity Constraint (무결성 제약조건, IC)

  • IC는, DB가 일관성을 유지하도록 강제하는 규칙이다.
  • IC는 스키마를 정의할 때 함께 지정한다.
  • DBMS는 데이터 삽입, 수정 시 IC를 준수하는지 자동 검사한다.

종류

설명

예시

Domain Constraint (도메인 제약)

각 속성(열)이 가질 수 있는 데이터의 형식과 범위를 제한

CHAR(20), INTEGER, REAL, DATE

Key Constraint (키 제약)

튜플(행)의 유일성을 보장

PRIMARY KEY, UNIQUE

Entity Integrity (개체 무결성)

기본키는 NULL이 될 수 없음

PRIMARY KEY (sid)

Referential Integrity (참조 무결성)

외래키가 참조하는 값은 반드시 다른 테이블에 존재해야 함

FOREIGN KEY (sid) REFERENCES Students(sid)

General Constraint (일반 조건 제약)

개발자가 지정한 논리적 조건

CHECK (age > 0), CHECK (gpa BETWEEN 0 AND 4.5)

  • check 문 예제
CREATE TABLE Students (
sid CHAR(20),
name CHAR(20),
age INTEGER CHECK (age > 0)
);
  • primary key
    • 기본키(Primary Key)는 각 행을 유일하게 식별하는 최소 속성 집합이며 중복될 수도, NULL일 수도 없다.
    • SuperKey : 유일성만 만족. 최소성x
    • CandidateKey : 유일성 + 최소성
    • PrimaryKey : 후보키 중 선택된 하나
    • PRIMARY KEY 라는 키워드로 pk를 설정할 수 있다.
      • 유일성을 강제하고 NULL을 허용하지 않는다.
    • UNIQUE 라는 키워드로 수퍼키 혹은 후보키를 설정할 수 있다.
      • 유일성은 강제하지만 NULL은 허용한다.(DB 따라 다름)
    • 예제
CREATE TABLE Students (
sid CHAR(20),
name CHAR(20),
login CHAR(20),
age INTEGER,
gpa REAL,
PRIMARY KEY (sid)
);
CREATE TABLE Students (
sid CHAR(20) PRIMARY KEY,
name CHAR(20) UNIQUE,
age INTEGER CHECK (age > 0)
);

Foreign Keys, Referential Integrity (외래키와 참조 무결성)

외래키 : 한 테이블의 특정컬럼이 다른 테이블의 기본키를 참조하는 제약

외래키가 참조하는 값은 항상 실제로 존재해야한다.

-- 학생 정보 테이블
CREATE TABLE Students (
  sid CHAR(20) PRIMARY KEY,
  name CHAR(20),
  login CHAR(20),
  age INTEGER,
  gpa REAL
);

-- 수강 정보 테이블
CREATE TABLE Enrolled (
  sid CHAR(20),
  cid CHAR(20),
  grade CHAR(2),
  FOREIGN KEY (sid) REFERENCES Students(sid)
);
  • Enrolled 테이블의 sid 컬럼은Students 테이블의 sid(기본키)를 참조한다.
  • Students 테이블에 없는 sid 값은Enrolled 테이블에 삽입될 수 없음

또한 아래처럼, referential integrity 를 걸어줄 수 있다.

Default 는 NO ACTION으로, 그냥 삭제랑 업데이트가 거부된다.

FOREIGN KEY ([참조한 다른 pk]...) REFERENCES [ 참조 대상 테이블명]
  ON DELETE SET DEFAULT -- SET NULL 같은것도 있음
  ON UPDATE CASCADE 

ERD에서, 마름모로 그려진 Relations 를 테이블로 바꿀때는, 관계에 연결된 엔티티 세트 각각의 PK가 FK로 있어야하며, 관계 자체의 attribute 도 컬럼으로 가져야한다. 생각보다 규칙이 명확하네요

정리하자면

  • 무결성 제약과 키를 잘 설계해야 데이터가 일관성을 유지합니다.
  • SQL은 “무엇을”만 표현하면 “어떻게”는 DBMS가 처리해 줍니다.
  • 관계형 모델은 데이터를 표 형태로 저장하는 가장 표준적인 방식입니다.