❓
물음표살인마 블로그
  • README
  • ALGORITHM
    • Sieve of Eratosthenes
    • Round Up
    • Binary Search
    • Union Find
    • Sorting Array
    • Lcm, Gcd
  • TechTalk Review
    • Template
  • Books
    • CS Note for Interview
      • Ch1. Design Pattern & Programming paradigm
        • 1.1.1 Singleton Pattern
        • 1.1.2 Factory Pattern
        • 1.1.4 Observer Pattern
        • 1.1.5 Proxty Pattern & Proxy Server
        • 1.1.8 Model-View-Controller Pattern
        • 1.2.1 Declarative and Functional Programming
        • 1.2.2 Object Oriented Programming
      • Ch2. Network
        • 2.2.1 TCP/IP Four-Layer Model
        • 2.2.1-1 TCP 3, 4 way handshake
        • 2.3 Network Devices L4, L7
        • 2.4.1 ARP, RARP
        • 2.4.2 Hop By Hop Communication
        • 2.4.3 IP Addressing Scheme
      • Ch3. Operating System
        • 3.1.1 Roles and Structure of Operating Systems
        • 3.2.1 Memory Hierarchy
        • 3.2.2 Memory Management
        • 3.3.1 Processes and Compilation Process
        • 3.3.3 Memory Structure of a Process
        • 3.3.4 Process Control Block (PCB)
        • 3.3.5 Multiprocessing
        • 3.3.6 Threads and Multithreading
        • 3.3.7 Shared Resources and Critical Sections
        • 3.3.8 Deadlock
        • 3.4 CPU Scheduling Algorithm
      • Ch4. Database
        • 4.1 Database Basic
        • 4.2 Normalization
        • 4.3 Transaction and Integrity
        • 4.4 Types of Databases
        • 4.5 Indexes
        • 4.6 Types of Joins
        • 4.7 Principles of Joins
      • Ch5. Data Structure
    • Learning the Basics of Large-Scale System Design through Virtual Interview Cases
      • 1. Scalability based on user counts(1/2)
      • 1. Scalability based on user counts(2/2)
      • 2.Back-of-the-envelope estimation
      • 3. Strategies for System Design Interviews
      • 4. Rate Limiter
      • 5. Consistent Hashing
      • 6. Key-Value System Design
      • 7. Designing a Unique ID Generator for Distributed Systems
      • 8. Designing a URL Shortener
      • 9. Designing a Web Crawler
      • 10. Notification System Design
      • 11. Designing a News Feed System
      • 12. Chat System Design
      • 13. AutoComplete
      • 14. Design YouTube
      • 15. Design Google Drive
      • Loadbalancer Algorithms
      • Cache tier
      • CDN, Content Delivery Network
      • Stateless Web tier
    • Computer System A programmer's perspective
    • Effective Java
      • Item 1. Consider Static Factory Methods Instead of Constructors
      • Item 2. Consider a Builder When Faced with Many Constructor Parameters
      • Item 3. Ensure Singleton with Private Constructor or Enum Type
      • Item 4. Enforce Noninstantiability with a Private Constructor
      • Item 5. Prefer Dependency Injection to Hardwiring Resources
      • Item 6. Avoid Creating Unnecessary Objects
      • Item 7. Eliminate Obsolete Object References
      • Item 8. Avoid Finalizers and Cleaners
      • Item 9.Prefer try-with-resources to try-finally
      • Item10. Adhering to General Rules When Overriding equals
        • Handling Transitivity Issues
        • Ensuring Consistency
      • Item11. Override hashCode When You Override equals
      • Item12. Always Override toString
        • Always Override toString
      • Item13. Override Clone Judiciously
      • Item14. Consider Implementing Comparable
      • Item15. Minimize the Accessibility of Classes and Members
      • Item16. Accessor Methods Over Public Fields
      • Item17. Minimize Mutability
      • Item18. Composition over inherentance
      • Item19. Design and Document for Inheritance, or Else Prohibit It
      • Item20. Prefer Interfaces to Abstract Classes
      • Item21. Design Interfaces with Implementations in Mind
      • Item22. Use Interfaces Only to define Types
      • Item23. Prefer Class Hierarchies to Tagged Classes
      • Item24. Favor Static Member Classes Over Non-Static
      • Item28. Use Lists Instead of Arrays
      • Item29. Prefer Generic Types
      • Item30. Favor Generic Methods
    • Head First Design Patterns
      • Ch1. Strategy Pattern
      • Ch2. Observer Pattern
        • Ver1. Ch2. Observer Pattern
      • Ch3. Decorator Pattern
        • Ch3. Decorator Pattern
      • Ch4. Factory Pattern
      • Ch5. Singleton Pattern
      • Ch6. Command Pattern
      • Ch7. Adapter and Facade Pattern
      • Ch8. Template Method Pattern
    • Digging Deep into JVM
      • Chapter 2. Java Memory Area & Memory Overflow
      • Chapter 3. Garbage Collector & Memory Allocation Strategy (1/2)
      • Chapter 3. Garbage Collector & Memory Allocation Strategy (2/2)
      • Chapter 5. Optimization Practice
      • Chapter 6. Class file structure
      • Chapter 8. Bytecode Executor Engine (1/2)
  • Interview Practices
    • Restful API Practices
      • Url Shortener API
      • Event Ticket Reservation API
      • Course Management API
      • Search posts by tags API
      • Online Code platform API
      • Simple Task Management API
      • Event Participation API
      • Review System API
      • Car management API
      • Online Library
    • Tech Review
      • if(kakao)
        • Kakao Account Cache Migration / if(kakao)2022
        • Improving the Anomaly Detection System for KakaoTalk Messaging Metrics / if(kakao) 2022
        • Standardizing API Case Handling Without Redeployment / if(kakaoAI)2024
        • JVM warm up / if(kakao)2022
    • Naver Computer Science
      • Process & Thread
      • TCP & UDP
      • Spring & Servlet
      • Filter & Interceptor & AOP
      • Equals() & ==
      • Dependency Injection
      • Object Oriented Programming
  • F-Lab
    • Week1
      • Client & Server
      • HTTP
      • TCP/UDP
      • REST API
      • Questions
        • Object Oriented Programming
        • HTTP
        • Process & Thread
        • Data Structure
    • Week2
      • OSI 7 layer
      • Web vs WAS
    • Week3
      • RDB vs NoSQL
      • RDB Index
      • Cache
      • Redis
      • Messaging Queue
    • Week4
      • Project - Ecommerce
    • Week5
      • ERD - 1
    • Week6
      • Ecommerce - 2
      • Role
      • pw hashing && Salt
      • CreatedAt, ModifiedAt
      • JWT
      • Copy of ERD - 1
    • Week7
      • Vault (HashiCorp Vault)
    • Week 8
      • Api Endpoints
    • Week10
      • Product Create Workflow
  • TOY Project
    • CodeMentor
      • Implementation of Kafka
      • Project Improvement (Architectural Enhancements)
      • Communication between servers in msa
  • JAVA
    • MESI protocol in CAS
    • CAS (Compare and Set)
    • BlockingQueue
    • Producer & Consumer
    • Synchronized && ReentrantLock
    • Memory Visibility
    • Checked vs Unchecked Exception
    • Thread
    • Batch delete instead of Cascade
    • Java Questions
      • Week 1(1/2) - Basic Java
      • Week 1(2/2) - OOP
      • Week 2(1/2) - String, Exception, Generic
      • Week2(2/2) Lambda, Stream, Annotation, Reflection
      • Week3(1/2) Collections
      • Week3(2/2) Threads
      • Week4 Java Concurrency Programming
      • Week5 JVM & GC
    • Java 101
      • JVM Structure
      • Java Compiles and Execution Method
      • Override, Overload
      • Interface vs Abstract Class
      • Primitive vs Object Type
      • Identity and equality
      • String, StringBuilder, StringBuffer
      • Checked Exceptions and Unchecked Exceptions
      • Java 8 methods
      • Try-with-reources
      • Strong Coupling and Loose Coupling
      • Serialization and Deserialization
      • Concurrency Programming in Java
      • Mutable vs Immutable
      • JDK vs JRE
  • SPRING
    • DIP. Dependency Inversion Principal
    • Ioc container, di practice
    • @Transactional
    • Proxy Pattern
    • Strategy Pattern
    • Template Method Pattern
    • using profile name as variable
    • Spring Questions
      • Spring Framework
      • Spring MVC & Web Request
      • AOP (Aspect-Oriented Programming)
      • Spring Boot
      • ORM & Data Access
      • Security
      • ETC
  • DATABASE
    • Enhancing Query Performance & Stability - User list
    • Ensuring Data Consistency, Atomicity and UX Optimization (feat.Firebase)
    • Redis: Remote Dictionary Server
    • Database Questions
      • Week1 DBMS, RDBMS basics
      • Week2 SQL
      • Week3 Index
      • Week4 Anomaly, Functional Dependency, Normalization
      • Week5 DB Transaction, Recovery
    • Normalization
      • 1st Normal Form
      • 2nd Normal Form
      • 3rd Normal Form
  • NETWORK
    • HTTP & TCP head of line blocking
    • HTTP 0.9-3.0
    • Blocking, NonBlocking and Sync, Async
    • Network Questions
      • Week1 Computer Network Basic
      • Week2(1/3) Application Layer Protocol - HTTP
      • Week2(2/3) Application Layer Protocol - HTTPS
      • Week2(3/3) Application Layer Protocol - DNS
      • Week3 Application Layer
      • Week4 Transport Layer - UDP, TCP
      • Week5 Network Layer - IP Protocol
    • Network 101
      • https://www.google.com
      • TCP vs UDP
      • Http vs Https
      • TLS Handshake 1.2
      • HTTP Method
      • CORS & SOP
      • Web Server Software
  • OS
    • Operating System Questions
      • Week1 OS & How Computer Systems Work
      • Week2(1/2) Process
      • Week2(2/2) Thread
      • Week3 CPU Scheduling
      • Week4 Process Synchronize
      • Week5 Virtual Memory
    • Operating System 101
      • Operating system
        • The role of the operating system
        • The composition of the operating system.
      • Process
        • In Linux, are all processes except the initial process child processes?
        • Zombie process, orphan process
        • (Linux) Daemon process
        • Process address space
        • Where are uninitialized variables stored?
        • Determination of the size of the Stack and Heap
        • Access speed of Stack vs Heap
        • Reason for memory space partitioning
        • Process of compiling a process
        • sudo kill -9 $CURRENT_PID
      • Thread
        • Composition of a thread's address space
      • Process vs Thread
        • Creation of processes and threads in Linux
      • Multiprocessing
        • Web Browser
        • Implementation of multiprocessing
        • Application areas of multiprocessing
      • Multithreading
        • Application areas of multithreading
      • Interrupt
        • HW / SW Interrupt
        • Method of handling interrupts
        • Occurrence of two or more interrupts simultaneously
      • Polling
      • Dual Mode
        • Reason for distinguishing between user mode and kernel mode
      • System call
        • Differentiation between system calls
        • Types of system calls
        • Execution process of a system call
      • Process Control Block (PCB)
        • PCB의 구조
        • 쓰레드는 PCB를 갖고 있을까?
        • 프로세스 메모리 구조
      • Context switching
        • Timing of context switching
        • Registers saved during context switching
        • Context switching in processes
        • Context switching in threads
        • Difference between context switching in processes and threads
        • Information of the current process during context switching
      • Interprocess Communication (IPC)
        • Cases where IPC is used
        • Process address space in IPC Shared Memory technique
        • Types of IPC
  • COMPUTER SCIENCE
    • Computer Architecture 101
      • 3 components of a computer
      • RAM vs ROM
      • CPU vs GPU
      • SIMD
      • Two's complement
      • Harvard Architecture vs. von Neumann Architecture
      • The structure of a CPU.
      • Instruction cycle (CPU operation method)
      • Instruction pipelining
      • Bus
      • Memory area
      • Memory hierarchy structure
        • Reason for using memory hierarchy structure
      • Cache memory
      • L1, L2, L3 Cache
      • Locality of reference (cache)
      • Fixed-point vs Floating-point
        • epresentation of infinity and NaN (Not a Number) in floating-point
      • RISC vs CISC
      • Hamming code
      • Compiler
      • Linking
      • Compiler vs Interpreter
      • Mutex vs Semaphore
      • 32bit CPU and 64bit CPU
      • Local vs Static Variable
      • Page
  • Programming Paradigm
    • Declarative vs Imperative
  • JPA, QueryDsl
    • why fetchResults() is deprecated
  • PYTHON
    • Icecream
  • FASTAPI
    • Template Page
  • LINUX
    • Template Page
  • DATA STRUCTURE
    • Counting Sort
    • Array vs Linked List
  • GIT, Github
    • git clone, invalid path error
  • INFRA
    • Template Page
  • AWS
    • Server Log Archive Pipeline
    • Image Processing using Lambda
  • DOCKER
    • Docker and VM
    • Python Executable Environment
    • Docker commands
  • docker-compose
    • Kafka, Multi Broker
  • KUBERNATES
    • !Encountered Errors
      • my-sql restarts
      • kafka producer: disconnected
    • Kubernetes Components
    • Helm
      • Helm commands
    • Pod network
    • Service network
      • deployment.yaml
      • services.yaml
    • Service type
      • Cluster IP
      • NodePort
    • service-name-headless?
    • kube-proxy
  • GraphQL
    • Template Page
  • WEB
    • Template Page
  • Reviews
    • Graphic Intern Review
    • Kakao Brain Pathfinder Review
    • JSCODE 자바 1기 Review
  • 😁Dev Jokes
    • Image
      • Plot twist
      • Priorities
      • SQL join guide
      • Google is generous
      • Genie dislikes cloud
      • buggy bugs
      • last day of unpaid internship
      • what if clients know how to inspect
      • its just game
      • how i wrote my achievement on resume
      • self explanatory
      • chr(sum(range(ord(min(str(not))))))
Powered by GitBook
On this page
  • Tables & Relations
  • ERD (Draft)
  • 1. User
  • 2. Role
  • 3. ShippingAddress
  • 4. Cart
  • 5. CartItem (Cart : Product. M:M)
  • 6. Order
  • 7. OrderItem (Order : Product. M:M)
  • 8. Product
  • 9. Category
  • 10. Payment
  • 11. Shipping
  • 12. Promotion
  • 13. Review
  • 14. Admin
  • 15. Statistics
  • 16. EventLog
  • 17. WishList
  • 18. Notification
  • 19. Coupon
  1. F-Lab
  2. Week5

ERD - 1

admin, api, batch, common

Tables & Relations

(j=i+1; j<n; j++)

  • User - 유저정보

    • Role - User가 어떤 권한을 가질지 Role 테이블로 관리 (N:1)

    • ShippingAddress - User는 여러 배송지를 가질 수 있음 (1:N)

    • Cart - 한 사용자는 하나의 장바구니를 가짐 (1:N)

    • Order - 한 사용자는 여러 주문을 생성 (1:N)

    • Product - 판매자일 경우, 여러 상품을 등록할 수 있음 (1:N)

    • Review - 유저는 여러개의 리뷰를 작성할 수 있음 (1:N)

    • EventLog - 유저의 비즈니스 로그(서버 로그X) 저장 (1:N)

    • WishList - 유저는 여러개의 제품을 찜 목록에 둘 수 있음 (1:N)

    • Notification - 특정 사용자에게 여러 알림이 발송될 수 있음 (1:N)

    • Coupon - 유저가 해당 제품 또는 어떠한 제품에 대해 사용할 수 있는 쿠폰 (1:N)

  • Role - 권한

  • ShippingAddress - 배송지

    • Order - 주문시 어떤 배송지를 사용할지 저장 (1:1)

  • Cart - 장바구니

    • CartItem - 장바구니 안에 여러 상품이 포함됨 (1:N)

  • CartItem - 장바구니에 담긴 제품

    • Product - 어떤 상품은 여러 장바구니에 담길 수 있음 (N:1)

  • Order - 주문

    • OrderItem - 한 주문에는 여러 제품이 포함 될 수 있음 (1:N)

    • Payment - 한 주문에 대한 하나의 결제 정보가 연결되어야 함(1:1)

    • Shipping - 한 주문당 하나의 배송 정보가 연결되어야 함(1:1)

  • OrderItem - 주문과 제품 N:N

  • Product - 제품

    • Category - 한 제품은 하나의 카테고리를 가질 수 있음(1:1)

    • Promotion - 한 제품은 여러개의 프로모션에 해당 될 수 있음(1:N)

    • Review - 한 제품은 여러개의 리뷰를 가질 수 있음 (1:N)

    • WishList - 여러 제품은 여러 유저의 찜목록에 포함될 수 있음 (N:N)

    • Coupon - 한 제품은 여러개의 쿠폰을 가질 수 있음 (1:N)

  • Category - 제품 카테고리

  • Payment - 주문 결제 정보를 저장

  • Shipping - 배송 상태 및 송장 번호를 관리하는 테이블

  • Promotion - 할인 쿠폰 및 이벤트 적용 정보를 저장하는 테이블

  • Review - 리뷰

  • Admin - 관리자 계정

  • Statistics - 통계

  • EventLog - 로그

  • WishList - 찜 목록

  • Notification - 알림

  • Coupon - 사용자 쿠폰

ERD (Draft)

CREATE DATABASE Ecommerce;
USE Ecommerce;

-- 1. Role (사용자 역할)
CREATE TABLE Role (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name ENUM('CUSTOMER', 'SELLER', 'ADMIN') NOT NULL UNIQUE
);

-- 2. User (사용자)
CREATE TABLE User (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (role_id) REFERENCES Role(id)
);

-- 3. Category (카테고리)
CREATE TABLE Category (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL UNIQUE
);

-- 4. Product (상품)
CREATE TABLE Product (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10,2) NOT NULL,
    stock INT NOT NULL,
    user_id BIGINT NOT NULL, -- 판매자
    category_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id),
    FOREIGN KEY (category_id) REFERENCES Category(id)
);

-- 5. ShippingAddress (배송지)
CREATE TABLE ShippingAddress (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    address VARCHAR(500) NOT NULL,
    city VARCHAR(100) NOT NULL,
    postal_code VARCHAR(20) NOT NULL,
    country VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id)
);

-- 6. Cart (장바구니)
CREATE TABLE Cart (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id)
);

-- 7. Order (주문)
CREATE TABLE `Order` (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    shipping_address_id BIGINT NOT NULL,
    total_price DECIMAL(10,2) NOT NULL,
    status ENUM('PENDING', 'PAID', 'SHIPPED', 'DELIVERED', 'CANCELLED') NOT NULL DEFAULT 'PENDING',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id),
    FOREIGN KEY (shipping_address_id) REFERENCES ShippingAddress(id)
);

-- 8. Payment (결제 정보)
CREATE TABLE Payment (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT NOT NULL UNIQUE,
    payment_method ENUM('CREDIT_CARD', 'PAYPAL', 'BANK_TRANSFER') NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    status ENUM('PENDING', 'COMPLETED', 'FAILED') NOT NULL DEFAULT 'PENDING',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (order_id) REFERENCES `Order`(id)
);

-- 9. Shipping (배송 정보)
CREATE TABLE Shipping (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT NOT NULL UNIQUE,
    tracking_number VARCHAR(255) NOT NULL,
    status ENUM('PENDING', 'IN_TRANSIT', 'DELIVERED', 'RETURNED') NOT NULL DEFAULT 'PENDING',
    estimated_delivery DATE,
    FOREIGN KEY (order_id) REFERENCES `Order`(id)
);

-- 10. CartItem (장바구니 아이템)
CREATE TABLE CartItem (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    cart_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    quantity INT NOT NULL DEFAULT 1,
    added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (cart_id) REFERENCES Cart(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES Product(id) ON DELETE CASCADE
);

-- 11. OrderItem (주문 아이템)
CREATE TABLE OrderItem (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    order_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    quantity INT NOT NULL,
    price DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (order_id) REFERENCES `Order`(id) ON DELETE CASCADE,
    FOREIGN KEY (product_id) REFERENCES Product(id)
);

-- 12. Promotion (할인 정보)
CREATE TABLE Promotion (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    discount_percentage DECIMAL(5,2) NOT NULL,
    valid_from DATE NOT NULL,
    valid_until DATE NOT NULL
);

CREATE TABLE Order_Promotion (
    order_id BIGINT NOT NULL,
    promotion_id BIGINT NOT NULL,
    PRIMARY KEY (order_id, promotion_id),
    FOREIGN KEY (order_id) REFERENCES `Order`(id) ON DELETE CASCADE,
    FOREIGN KEY (promotion_id) REFERENCES Promotion(id) ON DELETE CASCADE
);

-- 13. Coupon (쿠폰 정보)
CREATE TABLE Coupon (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    discount_amount DECIMAL(10,2) NOT NULL,
    expiration_date DATE NOT NULL
);

CREATE TABLE Order_Coupon (
    order_id BIGINT NOT NULL,
    coupon_id BIGINT NOT NULL,
    PRIMARY KEY (order_id, coupon_id),
    FOREIGN KEY (order_id) REFERENCES `Order`(id) ON DELETE CASCADE,
    FOREIGN KEY (coupon_id) REFERENCES Coupon(id) ON DELETE CASCADE
);

-- 14. Review (리뷰)
CREATE TABLE Review (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    order_item_id BIGINT NOT NULL UNIQUE,
    rating INT CHECK (rating BETWEEN 1 AND 5),
    comment TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id),
    FOREIGN KEY (product_id) REFERENCES Product(id),
    FOREIGN KEY (order_item_id) REFERENCES OrderItem(id)
);

-- 15. Admin (운영자 계정)
CREATE TABLE Admin (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL
);

-- 16. Statistics (상품 통계)
CREATE TABLE Statistics (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    product_id BIGINT NOT NULL,
    total_sales INT DEFAULT 0,
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (product_id) REFERENCES Product(id)
);

-- 17. EventLog (사용자 활동 기록)
CREATE TABLE EventLog (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    event_type VARCHAR(255) NOT NULL,
    event_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id)
);

-- 18. WishList (찜 목록)
CREATE TABLE WishList (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    product_id BIGINT NOT NULL,
    added_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id),
    FOREIGN KEY (product_id) REFERENCES Product(id)
);

-- 19. Notification (알림)
CREATE TABLE Notification (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    message TEXT NOT NULL,
    is_read BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES User(id)
);

1. User

사용자는 이커머스 플랫폼에서 상품을 구매하거나 판매하는 역할

  • User : Role = N:1 (각 사용자는 하나의 역할을 가짐)

  • User : Order = 1:N (각 사용자는 여러 개의 주문을 가질 수 있음)

  • User : Cart = 1:1 (각 사용자는 하나의 장바구니만 보유 가능)

  • User : ShippingAddress = 1:N (각 사용자는 여러 개의 배송지를 가질 수 있음)

  • User: WishList = 1 : N (각 사용자는 하나의 찜 목록을 가질 수 있음)

2. Role

일반 사용자, 판매자, 관리자로 구분

3. ShippingAddress

사용자는 여러 개의 배송지를 저장할 수 있으며, 주문 시 특정 배송지를 선택

  • User : ShippingAddress = 1:N (각 사용자는 여러 개의 배송지를 가질 수 있음)

  • ShippingAddress : Order = 1:N (각 배송지는 여러 개의 주문과 연결될 수 있음)

4. Cart

사용자는 하나의 장바구니를 가지며, 장바구니에는 여러 개의 상품이 포함

  • User : Cart = 1:1 (각 사용자는 하나의 장바구니만 가질 수 있음)

  • Cart : CartItem = 1:N (각 장바구니는 여러 개의 상품을 포함 가능)

5. CartItem (Cart : Product. M:M)

장바구니에 담긴 개별 상품 정보를 저장

  • Cart : CartItem = 1:N (각 장바구니는 여러 개의 상품을 포함 가능)

  • Product : CartItem = 1:N (각 상품은 여러 개의 장바구니에 포함될 수 있음)

6. Order

사용자가 결제를 완료하면 생성되는 주문 정보를 저장하는 테이블

  • User : Order = 1:N (각 사용자는 여러 개의 주문을 할 수 있음)

  • ShippingAddress : Order = 1:N (각 배송지는 여러 개의 주문에 사용될 수 있음)

  • Order : OrderItem = 1:N (각 주문에는 여러 개의 상품이 포함될 수 있음)

  • Order : Payment = 1:1 (각 주문에는 하나의 결제 정보가 연결됨)

  • Order : Shipping = 1:1 (각 주문에는 하나의 배송 정보가 연결됨)

7. OrderItem (Order : Product. M:M)

주문 내 개별 상품 정보를 저장하는 테이블

  • Order : OrderItem = 1:N (각 주문에는 여러 개의 상품이 포함될 수 있음)

  • Product : OrderItem = 1:N (각 상품은 여러 개의 주문에서 참조될 수 있음)

8. Product

판매자가 등록한 상품 정보를 저장

  • User : Product = 1:N (각 판매자는 여러 개의 상품을 등록할 수 있음)

  • Category : Product = 1:N (각 카테고리에는 여러 개의 상품이 포함될 수 있음)

  • Product : OrderItem = 1:N (각 상품은 여러 개의 주문에서 참조될 수 있음)

  • Product : CartItem = 1:N (각 상품은 여러 개의 장바구니에 포함될 수 있음)

  • Product : Review = 1:N (각 상품은 여러 개의 리뷰를 가질 수 있음)

9. Category

상품을 분류하는 카테고리 테이블

Category : Product = 1:N (각 카테고리에는 여러 개의 상품이 포함될 수 있음)

10. Payment

주문 결제 정보를 저장하는 테이블

  • Order : Payment = 1:1 (각 주문은 하나의 결제와 연결됨)

11. Shipping

주문별 배송 상태 및 송장 번호를 관리하는 테이블

  • Order : Shipping = 1:1 (각 주문은 하나의 배송과 연결됨)

12. Promotion

할인 쿠폰 및 이벤트 적용 정보를 저장하는 테이블

  • Order : Promotion = N:M (하나의 주문에는 여러 개의 프로모션이 적용될 수 있음)

13. Review

사용자가 구매한 상품에 대한 리뷰 및 평점을 기록하는 테이블 리뷰는 배송 완료 후 작성할 수 있으며, 상품별 평균 평점을 계산

  • User : Review = 1:N (각 사용자는 여러 개의 리뷰를 작성 가능)

  • Product : Review = 1:N (각 상품은 여러 개의 리뷰를 가질 수 있음)

  • OrderItem : Review = 1:1 (각 주문된 상품은 하나의 리뷰와 연결 가능)

14. Admin

관리자(운영자) 계정 정보를 저장하는 테이블 (일반 사용자와 분리)

  • Admin 계정은 독립적으로 관리되며 User 테이블과 연결되지 않음

  • 관리자 역할(role)에 따라 권한을 부여할 수 있도록 구현 가능

15. Statistics

  • Product : Statistics = 1:N (가장 많이 판매된 상품 ID와 연결 가능)

  • 자동화 배치 작업을 통해 주기적으로 데이터가 업데이트됨

16. EventLog

  • User : EventLog = 1:N (사용자와 연결된 이벤트 기록 가능.

17. WishList

사용자가 관심 있는 상품을 저장 (장바구니와 별도)

  • User : Wishlist = 1:N (사용자는 여러 개의 상품을 찜할 수 있음)

  • Product : Wishlist = 1:N (하나의 상품이 여러 사용자의 찜 목록에 포함될 수 있음)

18. Notification

사용자에게 주문 상태 변경, 배송 정보 업데이트, 프로모션 등을 알리는 시스템

  • User : Notification = 1:N (각 사용자는 여러 개의 알림을 받을 수 있음)

19. Coupon

사용자가 사용할 수 있는 할인 쿠폰 정보 테이블

  • Order : Coupon = N:M (하나의 주문에는 여러 개의 쿠폰이 적용될 수 있음)

피드백 :

  1. Role은 있지만 권한이 없음. 권한 관리 체계 공부. (Enum을 HardCoding하지 않도록)

  2. User : Cart는 1:N로 여러 level 별로 만들 수 있지만, MVP에서는 1:1로만.

  3. 유저 테이블 Password 직접 관리? Password 관리 방식 Salt 공부.

  4. CreatedAt, ModifiedAt

  5. EventLog - EventType:종류(Label), Payload

  6. Admin, UserTable 분리가 맞다. Salt 추가. Admin을 따로 관리하게 되면 인증을 분리하고 다르게. 실제 기획에서는 admin 인증은 다르게 되어 있다.

  7. 3P를 하려면, User - Product 사이 Merchant-Vendor-Product(계층) 등의 계층 추가.

  8. Category: 실제로는 세금, 면세 품목 같은걸로 분류된다. 하지만 여기서는 Product기준으로

  9. Product, Review에 이미지 Url이 들어가야한다.

  10. User-Coupon연결이 안되어있다. Order랑 연결되어야한다. 만료, 중복할인 규칙 정해야한다.

  11. Promotion 제거하는게 좋을거 같음.

  12. Order - Shipping 좀 이상함. OrderItem마다 운송장이 있어야하지 않나?

  13. Seller를 없앤다. 3PL로 하지말고, Retail로 한다.

  14. 로그인 테이블 JWT

  15. JWT Payload - LifeCycle. JWT공부

PreviousWeek5NextWeek6

Last updated 3 months ago