1. 데이터베이스란?
데이터베이스(Database, DB)는 데이터를 체계적으로 저장하고 관리하는 시스템이다. 쉽게 말해, 우리가 웹사이트나 앱에서 정보를 저장하고 불러올 수 있도록 해주는 저장소 같은 것이다.
데이터 베이스를 사용하면 뭐가 좋을까요?
- 데이터를 효율적으로 저장하고 검색할 수 있다.
- 대량의 데이터를 체계적으로 관리할 수 있다.
- 여러 사용자가 동시에 데이터를 활용할 수 있다.
2.ERD란?
ERD(Entity-Relationship Diagram, 개체-관계 다이어그램)는 데이터베이스 설계를 시각적으로 표현하는 다이어그램이다!
쉽게 말해, 데이터가 어떻게 연결되어 있는제 한눈에 보여주는 지도 같은 것이다.
ERD를 알면 뭐가 좋을까요?
- 데이터베이스 구조를 쉽게 이해할 수 있다.
- 시스템의 논리적 구조를 명확하게 정의할 수 있다.
- 개발자, 기획자, 디자이너 간의 원활한 커뮤니케이션이 가능하다.
3. 데이터베이스의 핵심 개념
이해를 돕기 위해 '온라인 쇼핑몰'이 있다고 가정하자.
1) 기본키 (Primary Key, PK)
- 각 행(Row)을 고유하게 식별하는 키
- 한 테이블에는 하나의 PK만 존재 가능
- 예시) 모든 주문은 고유한 주문번호를 가져야한다. 예를들어 orders 테이블의 order_id가 기본 키가 된다.
Order 테이블
order_id (PK) | customer_name | order_date |
202503150001 | 김철수 | 2025-03-15 |
202503150002 | 이영희 | 2025-03-15 |
202503150003 | 박바둑 | 2025-03-15 |
2) 외래 키 (Foreign Key, FK)
- 다른 테이블의 기본 키를 참조하는 키
- 테이블 간 관계를 설정하는 데 사용 됨
- 예시) 주문 상세 내역을 저장하는 order_items 테이블을 생각해보자. 각 주문 상품은 어떤 주문에 속하는지 알아야 하므로, order_id를 외래키로 가진다.
Order_item 테이블
id | order_id (FK) | product_id | quantity |
1 | 202503150001 | 100 | 2 |
2 | 202503150002 | 201 | 1 |
3 | 202503150003 | 150 | 3 |
3) NOT NULL
- 값이 반드시 존재해야 하는 컬럼에 설정
- 예시) 상품의 이름과 가격은 필수 정보이다.
Products 테이블
id | name (NOT NULL) | price (NOT NULL) | description |
1 | 나이키 운동화 | 89000 | 편안한 착화감 |
2 | 아디다스 티셔츠 | 45000 | NULL |
3 | NULL | 75000 |
-> 마지막 행은 name이 null이여서 error이다.
4) UNIQUE
- 특정 컬럼의 값이 중복되지 않도록 설정
- 예시) 상품의 바코드 번호는 중복될 수 없다.
Products 테이블
id | name | barcode (UNIQUE) |
1 | 나이키 운동화 | 880123456789 |
2 | 아디다스 티셔츠 | 880123456790 |
3 | 퓨마 운동화 | 880123456789 |
-> 마지막 행은 barcode가 중복되어 에러이다.
5) 자동 증가 (AUTO_INCREMENT)
- 숫자형 PK가 자동으로 증가하도록 설정
- 예시) 리뷰가 작성될 때마다 자동으로 증가하는 id가 필요하다.
Reviews 테이블
review_id (AUTO_INCREMENT) | product_id | content |
1 | 100 | 배송이 빨라요 |
2 | 201 | 품질이 좋아요 |
3 | 150 | 사이즈가 딱 맞아요 |
6) 기본 값 (DEFAULT)
- 값이 입력되지 않았을 때 자동으로 설정되는 기본 값
- 예시) 새로운 상품이 등록될 때 기본적으로 재고 상태는 '판매중'으로 설정된다.
Products 테이블
id | name | status (DEFAULT 'ON_SALE' |
1 | 나이키 운동화 | ON_SALE |
2 | 아디다스 티셔츠 | SOLD_OUT |
3 | 퓨마 운동화 | ON_SALE |
-> 값 미지정시 자동으로 'ON_SALE' 할당
7) 인덱스 (INDEX)
- 데이터 검색 속도를 높이기 위해 특정 컬럼에 설정
- 예시) 상품 검색을 빠르게 하기 위해 product_name에 인덱스를 걸 수 있다.
4. ERD 관계선
1) 1:1 관계 (One-to-One)
- 한 개체가 다른 개체와 1:1로 연결됨
- 예시) 각 주문은 하나의 배송 정보를 가진다.
2) 1:N 관계 (One-to-Many)
- 한 개체가 여러 개의 다른 개체와 관계를 가짐
- 예시) 한 명의 고객은 여러 개의 주문을 할 수 있다.
3) M:N 관계 (Many-to-Many)
- 여러 개의 개체가 여러 개의 다른 개체와 관계를 가짐
- 하나의 상품은 여러 카테고리에 속할 수 있고, 각 카테고리는 여러 상품을 가질 수 있다.
4) 기호 종류
- |: 1개/실선은(dash) '1'을 나타낸다.
- ∈: 여러개/까마귀 발(crow's foot or Many)은 '다수' 혹은 '그 이상'을 나타낸다.
- ○: 0개/고리(ring or Optional)은 '0'을 나타낸다.
- Type1(실선과 실선): 정확히 1 (하나의 A는 하나의 B로 이어져 있다.)
- 예시: 회원과 프로필 (하나의 회원은 반드시 하나의 프로필을 가져야 함)
user_id (PK) | |
1 | kim@email.com |
2 | lee@email.com |
user_id (PK/FK) | nickname | bio |
1 | 김철수 | 안녕하세요 |
2 | 이영희 | 반갑습니다. |
- Type2(까마귀발): 여러개 (하나의 A는 여러개의 B로 구성되어 있다.)
- 예시: 카테고리와 상품 (하나의 카테고리는 여러 상품을 가질 수 있음)
category_id (PK) | name |
1 | 의류 |
product_id (PK) | category_id (FK) | name |
1 | 1 | 면티셔츠 |
2 | 1 | 청바지 |
3 | 1 | 후드티 |
- Type3(실선과 까마귀발): 1개 이상 (하나의 A는 하나 이상의 B로 구성되어 있다.)
- 예시: 주문과 주문상품 (주문은 반드시 1개 이상의 주문 상품을 가져야 함)
order_id (PK) | total_amount |
1 | 55000 |
order_id (FK) | product_id | quantity |
1 | 1 | 2 |
1 | 3 | 1 |
- Type4(고리와 실선): 0 혹은 1 (하나의 A는 하나 이하의 B로 구성되어 있다.)
- 예시: 사용자와 배송지 (사용자는 기본 배송지를 가질 수도 있고 없을 수도 있음)
user_id (PK) | name |
1 | 김철수 |
2 | 이영희 |
user_id (FK) | address |
1 | 서울시 강남구 |
2 | null |
- Type5(고리와 까마귀발): 0개 이상 (하나의 A는 0 또는 하나 이상의 B로 구성되어 있다.)
- 예시: 회원과 위시리스트 (회원은 위시리스트 상품을 가질 수도 있고 없을 수도 있음)
user_id (PK) | name |
1 | 김철수 |
2 | 이영희 |
user_id (FK) | product_id |
1 | 100 |
1 | 200 |
2 | null |
‼️ 보통 Type1, 3, 4, 5를 자주 사용하며, 사용하는 ERD 프로그램에 따라 조합 방식이 다를 수 있다.
출처
DB ERD 관계선(실선, 점선)과 기호에 대한 설명