Prisma에 대해 지난 포스팅에서 살펴보며 느낀 점은 DB 개념을 알아야 이것이 효과가 있다는 것이었다.
그래서! 다시 정리해서 기록해두고자 한다.
관계형 데이터베이스
데이터를 테이블(표) 형태로 저장하는 구조
like Excel
이것들이 서로 연관을 지어있기에 이를 관계형 데이터베이스라 한다.
각 데이터를 구분하는 고유한 값
📍 중복 불가능
📍 NULL 불가능
❗ 테이블당 하나 존재
으로 이것은 데이터를 식별하는 기준이 된다.
Foreign key는 다른 테이블의 PK를 참조하는 값이다.
예를 들어 하나의 게시글을 두고, 이 게시글이 어떤 사용자의 게시글인지는 users.id를 보면 알 수 있다.
테이블 간 연결을 해주며 데이터의 일관성을 유지하는 역할을 한다.
이런 Foreign Key에서 중요한 개념으로 참조 무결성이 있다.
FK는 반드시 존재하는 PK만 참조할 수 있다
이것은 존재하는 값들만 사용이 가능하다는 의미이고, 잘못된 데이터 연결을 막아준다
관계는 테이블과 테이블 사이의 연결 구조를 의미한다.
가장 많이 사용하는 관계
→ 한 명의 사용자가 여러 개의 게시글을 가질 수 있다
→ 여러 게시글은 하나의 사용자에 속한다
→ 여러 개가 서로 여러 개와 연결되는 구조
사용자 ↔ 태그
학생 ↔ 수업
이 경우 중간 테이블이 필요하다.
기본 개념에 대해 알아보았고 이제 제약 조건에 대해 알아보고자 한다
제약조건이라함은
잘못된 데이터가 들어오는 것을 막기 위한 규칙
즉, 데이터의 정확성과 일관성을 유지하기 위한 장치
대표적인 제약 조건들을 정리해서 보겠다.
| 제약 조건 | 의미 | 특징 | 사용 예시 |
|---|---|---|---|
| PRIMARY KEY | 데이터를 구분하는 고유값 | 중복 ❌, NULL ❌ | id |
| FOREIGN KEY | 다른 테이블과 연결 | 참조 무결성 유지 | user_id |
| NOT NULL | 반드시 값 입력 | NULL 허용 ❌ | name |
| UNIQUE | 중복 값 금지 | 같은 값 2번 ❌ | |
| DEFAULT | 기본값 자동 설정 | 값 없으면 자동 입력 | created_at |
예시를 살펴보자.
실습 과제로 나왔던 온라인 강의 플랫폼 테이블 구조 설계다.
요구사항
**요구사항:**
- 수강생은 이름, 이메일, 가입일 정보를 가진다
- 강사는 이름, 이메일, 소개글, 전문 분야 정보를 가진다
- 강의는 제목, 설명, 가격, 카테고리, 생성일 정보를 가지며, 한 명의 강사가 여러 강의를 만들 수 있다
- 수강생이 강의를 결제하면 수강 등록이 되고, 등록일과 결제 금액이 기록된다
- 수강생은 수강 중인 강의에 별점(1~5)과 텍스트 리뷰를 남길 수 있다
- 한 수강생이 같은 강의에 리뷰를 중복으로 남길 수 없다
**설계 조건:**
- PK, FK 명시
- UNIQUE 제약조건이 필요한 곳을 찾아서 적용
- DEFAULT 값이 적절한 곳에 설정
| 수강생 ID (PK) | 이름 | 이메일 (UNIQUE, NOT NULL) | 가입일 (DEFAULT NOW()) |
|---|---|---|---|
| id | name (NOT NULL) | email (UNIQUE, NOT NULL) | created_at |
| 강사 ID (PK) | 이름 | 이메일 (UNIQUE, NOT NULL) | 소개글 | 전문 분야 |
|---|---|---|---|---|
| id | name (NOT NULL) | email (UNIQUE, NOT NULL) | bio | specialty |
| 강의 ID (PK) | 제목 | 설명 | 가격 (NOT NULL) | 카테고리 | 생성일 (DEFAULT NOW()) | 강사 ID (FK, NOT NULL) |
|---|---|---|---|---|---|---|
| id | title (NOT NULL) | description | price (NOT NULL) | category | created_at | instructor_id |
| 결제 ID (PK) | 수강생 ID (FK, NOT NULL) | 등록일 (DEFAULT NOW()) | 결제 금액 (NOT NULL) | 강의 ID (FK, NOT NULL) |
|---|---|---|---|---|
| id | student_id | enrolled_at | payment_amount | lecture_id |
| 결제 ID (PK) | 수강생 ID (FK, NOT NULL) | 등록일 (DEFAULT NOW()) | 결제 금액 (NOT NULL) | 강의 ID (FK, NOT NULL) |
|---|---|---|---|---|
| id | student_id | enrolled_at | payment_amount | lecture_id |
정답이 맞는지는 모르지만, 이런 식으로 개념과 제약 조건을 사용해보았다.