ER모델
ER (Entity Relationship) 모델은 현실 세계에 존재하는 데이터를 개체(Entity)와 관계(Relationship) 로표현하는 개념적 데이터 모델이다.
ER 모델은 크게 개체(Entity) , 속성 (Attribute), 관계(Relationship)의 3가지 핵심 요소로 이루어져 있다.
1. 개체 (Entity)
개체는 현실 세계에서 독립적으로 존재하며 식별 가능한 사람, 사물, 장소, 사건 등을 의미한다.
고유한 속성(Attribute)를가지며 강한 개체와 약한 개체로 구분된다.
- 강한 개체 ( String Entity )
- 독립적으로 존재
- 자신만의 고유한 키 ( Primary key ) 를가짐
- ex) 학생 ( 학번(pk), 이름, 학과 ) - 학번 만으로 학생을 고유하게 식별 가능
- 약한 개체 (Weak Entity)
- 독립적으로 식별 될 수 없다.
- 기본 키가 없거나 부모 개체의 키에 의존해야 식별 가능 (foreign key)
- 항상 강한 개체와 연결되는 관계를 가짐
- 관계는 보통 식별 관계로 표현된다.
- ex) 수강 (성적, 학번(FK), 과목 코드(FK)) - 학번이나 과목 코드 만으로는 식별 불가
2. 속성 (Attribute)
속성은 개체(Entity) 또는 관계(Relationship)에 대한 특성이나 정보를 설명하는 요소이다.

3. 관계 (Relationship)
ER모델에서 관계는 두 개 이상의 개체 사이의 연관성을 나타내는 요소이다.
- 관계의 종류
- 이항 관계 (Binary Relationship) : 두 개체 간의 관계이다. ex) 학생 - 수강 - 과목
- 삼항 관계 (Ternary Relationship) : 세 개체가 동시에 관련된 관계 ex) 의사,환자,약물 간의 처방 관계
- 자기 관계 (Recursive/Unary Relationship) : 같은 객체가 자기 자신과 관계를 맺는 경우 ex) 직원 - 관리 - 직원
- 관계의 수적 제약 (Cardinality) : 개체 간 관계의 연결 수 제한을 나타내는 것
- 1:1 관계 : ex) 주민 - 주민등록증
- 1:N 관계 : ex ) 교수 - 강의
- M:N 관계 : ex) 학생 - 과목
- 식별 관계 (Identifying Relationship)
- 약한 개체는 강한 개체와의 관계를 통해서만 식별 될 수 있다. 이떄, 식별 관계를 사용한다.
4. 특수화 (Specialization)
하나의 상위 개체를 구체적이고 세분화된 하위 개체들로 나누는 것을 의미한다.
ex) 사람 -> 학생,교직원,졸업생
5. 일반화 (Generalization)
여러 비슷한 하위 개체들을 공통된 속성과 의미를 갖는 상위 개체를 만드는 것이다.
ex) 학생, 교수 -> 사람
관계형 데이터 베이스
관계형 데이터베이스는 데이터를 테이블 형식으로 저장하고 관리하는 데이터베이스이다. 테이블은 행과 열로 구성되어 있으며 각 테이블은 서로 관계를 맺을 수 있다.

키 종류

ER모델과 RDB 의 매핑
1. 개체 (Entity) -> 테이블 (Table)
- 정규 개체
- 하나의 테이블로 매핑
- 속성(attribute) -> 열(column)
- 키 속성 -> 기본키(primary key)
CREATE TABLE Student (
student_id VARCHAR(10) PRIMARY KEY,
name VARCHAR(50),
department VARCHAR(50)
);
- 약한 개체
- 고유 식별자가 없고 다른 개체에 의존
- 하나의 테이블로 매핑
- 부모 개체의 키는 외래키(fk) 설정
- 부모 개체의 키 + 자신의 식별자 -> 복합 기본키
CREATE TABLE Dependent (
employee_id INT,
dependent_name VARCHAR(50),
birth_date DATE,
PRIMARY KEY (employee_id, dependent_name),
FOREIGN KEY (employee_id) REFERENCES Employee(employee_id)
);
2. 속성(Attribute) -> 컬럼(Column)
- 단순(Simple) 속성
- 컬럼 하나로 매핑
- 복합(Composite) 속성
- 각각의 구성 요소를 별도 컬럼으로 분해
-- 주소: 시, 구, 도로명
CREATE TABLE Member (
member_id INT PRIMARY KEY,
city VARCHAR(50),
district VARCHAR(50),
street VARCHAR(100)
);
- 다중값(Multivalued) 속성
- 별도의 테이블로 분리 + 외래키 사용
-- 한 학생이 여러 전화번호를 가질 수 있다면
CREATE TABLE StudentPhone (
student_id INT,
phone_number VARCHAR(20),
PRIMARY KEY (student_id, phone_number),
FOREIGN KEY (student_id) REFERENCES Student(student_id)
);
- 유도(Derived) 속성
- 저장하지 않고 쿼리로 계산
-- 생년월일로 나이를 계산
SELECT name, YEAR(CURDATE()) - YEAR(birth_date) AS age
FROM Student;
3. 관계 (Relationship) -> 외래키 또는 관계 테이블
관계는 관계의 차수(cardinality)에 따라 매핑 방식이 달라진다.
- 1:1 관계
- 보통 한 쪽 테이블에 외래키 추가
CREATE TABLE StudentDetail (
student_id INT PRIMARY KEY,
address VARCHAR(100),
FOREIGN KEY (student_id) REFERENCES Student(student_id)
);
- 1:N 관계
- N(다수) 쪽에 외래키 추가
CREATE TABLE Course (
course_id INT PRIMARY KEY,
name VARCHAR(50),
professor_id INT,
FOREIGN KEY (professor_id) REFERENCES Professor(professor_id)
);
- N:M 관계
- 새로운 중간 테이블 생성
- 두 개체의 기본 키 -> 중간 테이블의 복합 기본키, 외래키
CREATE TABLE StudentCourse (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
4. 관계의 속성 -> 관계 테이블에 컬럼으로 포함
-- 학생이 과목을 수강하고, 성적이라는 속성을 가진 경우
CREATE TABLE Enrollment (
student_id INT,
course_id INT,
grade CHAR(2),
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
5. 일반화, 특수화 -> 상속 매핑
Single Table Inheritance (모든 서브 타입을 하나의 테이블로)
CREATE TABLE Employee (
emp_id INT PRIMARY KEY,
name VARCHAR(50),
type VARCHAR(10), -- 'professor', 'staff'
department VARCHAR(50),
research_area VARCHAR(100), -- 교수 전용
work_hours INT -- 직원 전용
);
Class Table Inheritance (상위 + 하위 테이블로 분리)
CREATE TABLE Employee (
emp_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE Professor (
emp_id INT PRIMARY KEY,
research_area VARCHAR(100),
FOREIGN KEY (emp_id) REFERENCES Employee(emp_id)
);
CREATE TABLE Staff (
emp_id INT PRIMARY KEY,
work_hours INT,
FOREIGN KEY (emp_id) REFERENCES Employee(emp_id)
);