데이터베이스에서 관계 설정은 데이터의 무결성과 효율적인 관리에 매우 중요하다. 관계를 설정한면 데이터베이스 시스템은 데이터의 일관성을 유지하고, 중복 데이터 입력을 방지며, 복잡한 쿼리를 쉽게 수행할 수 있다. 이러한 관계는 데이터베이스 설계의 핵심 요소로, 데이터를 어떻게 저장하고 검색할지에 큰 영향을 미친다.
참조 무결성
: 외래 키 제약 조건을 통해 관련된 테이블 간의 데이터 일관성을 유지할 수 있다. 예를 들어, 댓글이 존재하는 포스트가 삭제되면, 댓글도 자동으로 삭제되거나 외래 키 제약 조건으로 인해 삭제가 방지될수 있다.
중복 방지
: 관계를 설정하면 중복 데이터 입력을 방지할 수 있다. 예를 들어, 동일한 학생이 여러 번 등록되는 것을 방지할 수 있다.
복잡한 쿼리
: 관계형 데이터베이스는 조인을 통해 여러 테이블의 데이터를 효율적으로 조회할수 있다. 예를 들어, 특정 블로그 포스트와 그에 대한 모든 댓글을 한 번의 쿼리로 가져올수 있다.
데이터 무결성
: 관계를 설정하면 데이터 베이스 시스템이 자동으로 데이터의 일관성을 유지한다. 예를 들어, 사용자가 삭제되면 해당 사용자의 프로필도 자동으로 삭제할 수 있다.
인덱스 활용
: 관계형 데이터베이스는 인덱스를 활용하여 데이터를 빠르게 조회할 수 있다. 외래 키 제약 조건은 인덱스를 사용하여 조인 연산을 최적화할 수 있다.
데이터 정규화
: 관계를 설정하면 데이터를 정규화하여 데이터 중복을 최소화하고 저장 공간을 효율적으로 사용할 수 있다.
데이터베이스에서
무결성
이란 데이터의 정확성, 일관성, 완전성을 보장하는 것을 의미한다. 무결성은 데이터베이스 관리 시스템(DBMS)이 데이터의 신뢰성을 유지하고 데이터의 손상이나 오류를 방지하기 위해 중요한 개념이다.
CREATE TABLE User (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
age INT CHECK (age >= 0)
);
CREATE TABLE User (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
CREATE TABLE User (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
CREATE TABLE Order (
id INT PRIMARY KEY,
user_id INT,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES User(id)
);
CREATE TABLE User (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) UNIQUE
);
각 사용자는 하나의 프로필만 가질 수 있고, 각 프로필은 하나의 사용자에게만 속한다.
시각화: 사용자(User) <-> 사용자 프로필(Profile)
CREATE TABLE User (
id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
CREATE TABLE UserProfile (
user_id INT PRIMARY KEY,
bio TEXT,
FOREIGN KEY (user_id) REFERENCES User(id)
);
단일 테이블
: 두 테이블 중 하나의 기본 키를 다른 테이블의 외래 키로 사용한다. 보통 두 테이블 중 어느 한 테이블의 기본(PK)를 다른 테이블에 외래 키(FK)로 포함시키면 된다.각 블로그 포스트는 여러 댓글을 가질 수 있지만, 각 댓글은 하나의 포스트에만 속한다.
시각화: 블로그 포스트(Post) <->(Comment)
CREATE TABLE BlogPost (
id INT PRIMARY KEY,
title VARCHAR(100),
content TEXT
);
CREATE TABLE Comment (
id INT PRIMARY KEY,
post_id INT,
comment TEXT,
FOREIGN KEY (post_id) REFERENCES BlogPost(id)
);
PK와 FK 위치
다
쪽 테이블: 다 쪽 테이블에 외래 키(FK)가 포함된다. 1
쪽 테이블의 기본 키(PK)가 N
쪽 테이블의 외래 키(FK)가 된다.
각 학생은 여러 수업을 들을 수 있고, 각 수업에는 여러 학생이 참여할 수 있다.
시각화: 학생(Student) <-> 수업(Class)
테이블 구조
CREATE TABLE Student (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE Class (
id INT PRIMARY KEY,
title VARCHAR(100)
);
CREATE TABLE StudentClass (
student_id INT,
class_id INT,
PRIMARY KEY (student_id, class_id),
FOREIGN KEY (student_id) REFERENCES Student(id),
FOREIGN KEY (class_id) REFERENCES Class(id)
);
PK와 FK 위치
중간 테이블
: 두 테이블 사이에 중간 테이블(조인 테이블)을 만들어 두 테이블의 기본 키(PK)를 중간 테이블의 외래 키(FK)로 포함시킨다. 중간 테이블은 보통 두 외래 키를 복합 키로 사용한다.
// user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm';
import { UserProfile } from './userProfile.entity';
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
username: string;
@OneToOne(() => UserProfile)
@JoinColumn()
profile: UserProfile;
}
// userProfile.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm';
import { User } from './user.entity';
@Entity()
export class UserProfile {
@PrimaryGeneratedColumn()
user_id: number;
@Column()
bio: string;
@OneToOne(() => User)
user: User;
}
// blogPost.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';
import { Comment } from './comment.entity';
@Entity()
export class BlogPost {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
content: string;
@OneToMany(() => Comment, comment => comment.post)
comments: Comment[];
}
// comment.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from 'typeorm';
import { BlogPost } from './blogPost.entity';
@Entity()
export class Comment {
@PrimaryGeneratedColumn()
id: number;
@Column()
comment: string;
@ManyToOne(() => BlogPost, post => post.comments)
post: BlogPost;
}
// student.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany, JoinTable } from 'typeorm';
import { Class } from './class.entity';
@Entity()
export class Student {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToMany(() => Class, classEntity => classEntity.students)
@JoinTable()
classes: Class[];
}
// class.entity.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';
import { Student } from './student.entity';
@Entity()
export class Class {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@ManyToMany(() => Student, student => student.classes)
students: Student[];
}