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가 처리해 줍니다.
- 관계형 모델은 데이터를 표 형태로 저장하는 가장 표준적인 방식입니다.