E-commice용 간단한 MySQL 예제

발행: (2026년 3월 26일 AM 09:22 GMT+9)
3 분 소요
원문: Dev.to

Source: Dev.to

안녕하세요 여러분, SQL 사용 경험을 공유하고 싶습니다. 아래는 주요 테이블과 관계를 보여주는 간단한 전자상거래 스키마입니다.

역할 테이블

-- Role table
CREATE TABLE role (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL UNIQUE,
    description VARCHAR(255)
);

-- Insert default roles
INSERT INTO role (name, description) VALUES
    ('admin', 'Full system access'),
    ('customer', 'Can browse and place orders'),
    ('staff', 'Can manage orders and products'),
    ('vendor', 'Supplier with limited access');

사용자 테이블

CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    role_id INT NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    phone VARCHAR(20),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (role_id) REFERENCES role(id)
);

생산자 테이블 (사용자와 연결)

CREATE TABLE producer (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL UNIQUE,
    bio TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
);

카테고리 테이블

CREATE TABLE category (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL UNIQUE
);

-- Insert default categories
INSERT INTO category (name) VALUES
    ('Vegetables'),
    ('Fruits'),
    ('Dairy'),
    ('Honey & Preserves'),
    ('Meat & Poultry'),
    ('Drinks'),
    ('Bakery'),
    ('Herbs & Flowers');

제품 테이블

CREATE TABLE product (
    id INT AUTO_INCREMENT PRIMARY KEY,
    producer_id INT NOT NULL,
    category_id INT NOT NULL,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock_qty INT NOT NULL DEFAULT 0,
    unit VARCHAR(50) NOT NULL DEFAULT 'item',
    is_organic BOOLEAN DEFAULT FALSE,
    is_available BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (producer_id) REFERENCES producer(id) ON DELETE CASCADE,
    FOREIGN KEY (category_id) REFERENCES category(id)
);

주소 테이블

CREATE TABLE address (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    street VARCHAR(255) NOT NULL,
    city VARCHAR(100) NOT NULL,
    postcode VARCHAR(20) NOT NULL,
    country VARCHAR(100) NOT NULL DEFAULT 'United Kingdom',
    is_default BOOLEAN DEFAULT FALSE,
    FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE
);

주문 테이블

CREATE TABLE `order` (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    address_id INT NOT NULL,
    status ENUM('pending', 'confirmed', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
    total_price DECIMAL(10, 2) NOT NULL,
    payment_status ENUM('unpaid', 'paid', 'refunded') DEFAULT 'unpaid',
    payment_method VARCHAR(50),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (address_id) REFERENCES address(id)
);

주문 항목 테이블

CREATE TABLE order_item (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT NOT NULL DEFAULT 1,
    unit_price DECIMAL(10, 2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES `order`(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES product(id)
);

개선에 대한 피드백이나 제안이 있으면 언제든 알려 주세요!

0 조회
Back to Blog

관련 글

더 보기 »

SQLite는 어떤 인덱스를 사용해야 합니까?

인덱스가 존재하더라도, 잘못된 인덱스를 선택하면 쿼리가 크게 느려질 수 있습니다. 옵티마이저의 역할은 단순히 인덱스를 사용하는 것이 아니라, 올바른 인덱스를 사용하는 것입니다.

동기식 및 비동기식 JavaScript 배우기

Synchronous 동기식 프로그래밍에서는 작업이 순서대로 하나씩 실행됩니다. 각 코드 라인은 이전 작업이 끝날 때까지 기다렸다가 다음으로 이동합니다.