프로젝트
Database- 데이터베이스 (2일차: 데이터베이스와 테이블 생성)
Chansman
2025. 3. 19. 18:31
과제 2: 데이터베이스와 테이블 생성
이번 과제는 사용자와 주문 정보뿐만 아니라 재고, 판매 및 매출 정보를 저장하는 데이터베이스와 여러 테이블을 생성하는 것입니다. 이 과정은 MySQL에서 데이터베이스와 테이블을 설계하고 생성하는 기본적인 실습입니다.
1️⃣ 데이터베이스 생성
먼저, 붕어빵 가게의 데이터를 저장할 데이터베이스를 생성합니다. 데이터베이스는 CREATE DATABASE 명령어로 생성할 수 있습니다.
sql
CREATE DATABASE fishbread_db;
- 이 명령어로 fishbread_db라는 데이터베이스가 생성됩니다.
- 데이터베이스를 생성한 후, 사용하기 위해 USE 명령어를 사용합니다:
sql
USE fishbread_db;
2️⃣ users 테이블 생성
사용자 정보를 저장할 테이블을 생성합니다. 이 테이블에는 사용자 ID, 이름, 나이, 이메일 및 비즈니스 여부가 포함됩니다.
sql
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
email VARCHAR(100) UNIQUE,
is_business VARCHAR(10) DEFAULT 'No'
);
- user_id는 사용자의 고유 ID이며, AUTO_INCREMENT로 자동 증가합니다.
- name은 사용자의 이름이며, 필수 입력값으로 NOT NULL 제약을 두었습니다.
- age는 사용자의 나이를 나타냅니다.
- email은 사용자의 이메일로, UNIQUE 제약을 추가하여 중복된 이메일을 방지합니다.
- is_business는 비즈니스 여부를 나타내며, 기본값은 'No'입니다.
3️⃣ orders 테이블 생성
주문 정보를 저장할 테이블을 생성합니다. 이 테이블에는 주문 ID, 사용자 ID, 주문 날짜 및 주문 금액을 저장합니다.
sql
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
order_date DATE,
amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
- order_id는 주문의 고유 ID이며, AUTO_INCREMENT로 자동 증가합니다.
- user_id는 주문한 사용자의 ID로, users 테이블의 user_id 칼럼과 FOREIGN KEY 제약으로 참조 관계를 가집니다.
- order_date는 주문 날짜를 저장합니다.
- amount는 주문 금액을 저장하는 DECIMAL 타입입니다.
4️⃣ inventory 테이블 생성
재고 정보를 저장할 테이블을 생성합니다. 이 테이블에는 재고 항목의 ID, 이름 및 수량이 포함됩니다.
sql
CREATE TABLE inventory (
item_id INT PRIMARY KEY AUTO_INCREMENT,
item_name VARCHAR(255) NOT NULL,
quantity INT NOT NULL
);
- item_id는 재고 항목의 고유 ID이며, AUTO_INCREMENT로 자동 증가합니다.
- item_name은 재고 항목의 이름이며, 필수 입력값으로 NOT NULL 제약을 두었습니다.
- quantity는 재고 수량을 나타냅니다.
5️⃣ sales 테이블 생성
판매 정보를 저장할 테이블을 생성합니다. 이 테이블에는 판매 ID, 주문 ID, 재고 항목 ID 및 판매된 수량이 포함됩니다.
sql
CREATE TABLE sales (
sale_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
item_id INT,
quantity_sold INT NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (item_id) REFERENCES inventory(item_id)
);
- sale_id는 판매의 고유 ID이며, AUTO_INCREMENT로 자동 증가합니다.
- order_id는 판매가 발생한 주문의 ID로, orders 테이블의 **order_id**와 **FOREIGN KEY**로 참조 관계를 가집니다.
- item_id는 판매된 재고 항목의 ID로, inventory 테이블의 **item_id**와 **FOREIGN KEY**로 참조 관계를 가집니다.
- quantity_sold는 판매된 수량을 나타냅니다.
6️⃣ daily_sales 테이블 생성
일별 매출 정보를 저장할 테이블을 생성합니다. 이 테이블에는 날짜와 해당 날짜의 총 매출이 포함됩니다.
sql
CREATE TABLE daily_sales (
date DATE PRIMARY KEY,
total_sales DECIMAL(10, 2) NOT NULL
);
- date는 매출이 발생한 날짜를 나타내며, **PRIMARY KEY**로 설정하여 각 날짜에 대한 데이터를 하나만 저장할 수 있게 합니다.
- total_sales는 해당 날짜의 총 매출을 나타내는 DECIMAL 타입입니다.
전체 테이블 생성 예시
sql
-- 데이터베이스 생성
CREATE DATABASE fishbread_db;
-- 데이터베이스 사용
USE fishbread_db;
-- users 테이블 생성
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
age INT NOT NULL,
email VARCHAR(100) UNIQUE,
is_business VARCHAR(10) DEFAULT 'No'
);
-- orders 테이블 생성
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
order_date DATE,
amount DECIMAL(10, 2),
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- inventory 테이블 생성
CREATE TABLE inventory (
item_id INT PRIMARY KEY AUTO_INCREMENT,
item_name VARCHAR(255) NOT NULL,
quantity INT NOT NULL
);
-- sales 테이블 생성
CREATE TABLE sales (
sale_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
item_id INT,
quantity_sold INT NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (item_id) REFERENCES inventory(item_id)
);
-- daily_sales 테이블 생성
CREATE TABLE daily_sales (
date DATE PRIMARY KEY,
total_sales DECIMAL(10, 2) NOT NULL
);
요약
- 데이터베이스: 붕어빵 가게 데이터를 저장할 fishbread_db 생성.
- 테이블: 사용자 정보, 주문 정보, 재고, 판매 및 일 매출 정보를 저장하는 5개의 테이블 생성.
- 외래키(Foreign Key): orders, sales 테이블에서 다른 테이블과 관계를 설정.
1️⃣ 외래키 참조 문제 확인
- FOREIGN KEY 제약조건을 사용하면서 참조하는 users, orders, inventory 테이블이 먼저 생성되어 있어야 합니다.
- 참조하는 테이블이 존재하지 않으면 외래키 제약이 오류를 발생시킬 수 있습니다. 예를 들어, orders 테이블은 users 테이블을 참조하고, sales 테이블은 orders와 inventory 테이블을 참조합니다.
2️⃣ 테이블 생성 순서
- 테이블을 생성할 때 참조 관계가 있는 테이블들이 먼저 생성되어야 합니다. 순서가 맞지 않으면 FOREIGN KEY 제약 때문에 테이블이 생성되지 않을 수 있습니다.
따라서 users, orders, inventory, sales, daily_sales 테이블을 생성할 때 순서대로 쿼리를 실행해야 합니다.