요즘 토이 팀 프로젝트를 진행중이다. 여기서 백엔드의 역할을 맡아서 수행 중인데 DB 설계를 하고 MySQL 에러 해결한 내용을 기록하려고 한다.
일단 우리 프로젝트 주제는 "공동 구매 마켓 페이지"이다. 기획 제외하고 실질적인 개발 기간은 10일 정도라서 기능의 확장을 염두해두고 설계했다.
1. 로그인, 회원가입 - session, crypto 사용
2. 마이페이지에서 정보 수정, 정보 조회
3. 마이페이지에서 구매 등록, 판매 등록 정보 조회
4. 구매 등록하기
5. 판매 등록하기
1. DB 임시 설계
나는 DB를 4개로 나누어서 설계했다.
- User
- Category
- Product
- Order_item
각 상품에는 식품, 전자기기, 도서라는 카테고리가 존재하고 이를 조회할 수 있기 때문에 Category 테이블을 하나 만들어 join에서 사용하는 것이 효율적이라고 판단했다!
join에서 사용하는 것이 있기 때문에 외래키를 설정했는데 여기서 문제가 종종 발생했다...!
1) User 테이블
CREATE TABLE User (
user_id INT AUTO_INCREMENT PRIMARY KEY, -- 사용자 ID (Primary Key)
email VARCHAR(255) NOT NULL. -- 사용자 이메일
password VARCHAR(255) NOT NULL, -- 비밀번호 (해시 저장)
nickname VARCHAR(255) NOT NULL, -- 사용자 닉네임
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 생성일
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 수정일
);
2) Category 테이블
CREATE TABLE Category (
category_id INT PRIMARY KEY, -- 카테고리 ID (Primary Key)
category_name VARCHAR(255) NOT NULL -- 카테고리 이름
);
3) Product 테이블
CREATE TABLE Product (
product_id INT AUTO_INCREMENT PRIMARY KEY, -- 판매 물품 ID (Primary Key)
name VARCHAR(255) NOT NULL, -- 물품 이름
deadline DATE NOT NULL, -- 판매 마감 기한
price INT NOT NULL, -- 판매 가격
max_quantity INT NOT NULL, -- 판매 가능 최대 수량
image VARCHAR(255) NOT NULL, -- 물품 이미지 경로
category_id INT NOT NULL, -- 카테고리 ID (Foreign Key)
user_id INT NOT NULL, -- 주선자 사용자 ID (Foreign Key)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 생성일
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 수정일
FOREIGN KEY (category_id) REFERENCES Category(category_id) ON DELETE CASCADE, -- 카테고리 참조
FOREIGN KEY (user_id) REFERENCES User(user_id) ON DELETE CASCADE -- 주선자 참조
);
4) Order_item 테이블
CREATE TABLE Order_item (
order_item_id INT AUTO_INCREMENT PRIMARY KEY, -- 주문 아이템 ID (Primary Key)
product_id INT NOT NULL, -- 주문한 물품 ID (Foreign Key)
user_id INT NOT NULL, -- 주문자 사용자 ID (Foreign Key)
quantity INT NOT NULL, -- 주문 수량
address VARCHAR(255) NOT NULL, -- 주문자 주소
phone VARCHAR(20) NOT NULL, -- 주문자 전화번호
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 생성일
FOREIGN KEY (product_id) REFERENCES Product(product_id) ON DELETE CASCADE, -- 물품 참조
FOREIGN KEY (user_id) REFERENCES User(user_id) ON DELETE CASCADE -- 사용자 참조
);
2. Error 해결 - MySQL 1452
SQL를 통해 데이터베이스를 만들고 다음과 같은 테이블을 저장해서 사용한다.
여기서 주의할 점은 바로 foreign key이다! 아무생각 없이 테이블에 데이터를 삽입하려고하면, 이런 문제가 발생하기도 한다..!
MySQL Error Code: 1452. Cannot add or update a child row
이럴때는 테이블 간의 외래키 설정을 잘 확인해야한다.
예를 들어 product테이블의 product_id 컬럼을 order_items에서 외래키로 사용하고 있다. 따라서 db에 데이터를 삽입할 때는 무조건 product테이블의 product_id에서 존재하는 id를 넣어야 한다.
정리하면, 예를 들어 product 테이블에 product_id에 1을 삽입해야 order_item 테이블에 product_id가 1인 값을 삽입할 수 있다는 것이다.
즉, 데이터 삽입 순서는 다음과 같다.
1. Category 테이블
2. User 테이블
3. Product 테이블
4. Order_item 테이블
오늘도 이렇게 DB 개념에 대해서 하나 알아가는중!
'🙋♀️ Server' 카테고리의 다른 글
| [Server] Node.js + MySQL로 찜 기능 만들기 (0) | 2024.12.28 |
|---|---|
| [Server] sequelize를 이용한 중첩 조인 (0) | 2024.12.28 |
| [Web] MySQL + Node.js로 MVC 패턴 적용 (2) | 2024.12.03 |
| [Server] 임시 DB로 Node.js에서 MVC 패턴 연습하기 (0) | 2024.12.01 |
| [Web] let, var, const의 차이 (2) | 2024.11.09 |