본문 바로가기

프로젝트

[Database Mini Project] 쇼핑몰 데이터베이스 요구사항 분석 (데이터 정의, ERD, MySQL Script)

프로젝트 개요 

  • 쇼핑몰 데이터베이스 미니 프로젝트  
  • 2021.04.13 ~
  • 데이터베이스  
  • MySQL
MySQL을 이용해서 쇼핑몰 데이터베이스를 구축해보는 미니 프로젝트입니다.

Database Mini Project :
쇼핑몰 데이터베이스 요구사항 분석

 

1. 사이트맵

  • 랜딩 페이지
    • 회원가입
    • 로그인
      • 관리자 계정 로그인
        • 상품 등록 페이지
      • 구매자 계정 로그인
        • 쇼핑 카트 페이지
    • 상품 카테고리 네비게이션
      • 상품 카테고리 1
        • 상품 디테일 1
          • 주문 페이지
          • 또는 쇼핑 카트 페이지로 이동 (구매자 계정 로그인 한 경우에만 접근 가능)
        • 상품 디테일 2
        • ...
      • 상품 카테고리 2
        • 상품 디테일 1
        • 상품 디테일 2
        • ...
      • ...

2. 데이터 정의

2.1 사용자

  • [PK] id (고유 식별자) : 중복 불가, 필수
  • password : 필수
  • type : 필수 (consumer / administrator)
  • name

2.2 카테고리

  • [PK] id (고유 식별자) : 중복 불가, 필수
  • name

2.3 상품

상품 아이템의 메타데이터

  • [PK] id (고유 식별자) : 중복 불가, 필수
  • [FK] category_id → 카테고리 PK 참조
  • name : 필수
  • price : 필수
  • stock : 필수 (default = 1)
  • desc

2.4 아이템

  • [PK] id (고유 식별자) : 중복 불가, 필수
  • [FK] product_id → 상품 PK 참조
  • [FK] cart_id → 카트 PK 참조 (해당 아이템이 담길 카트의 id)

2.5 카트

  • [FK,PK] id → 사용자 PK 참조
  • items_count

2.6 주문

  • [PK] id (고유 식별자) : 중복 불가, 필수
  • date : 필수
  • total_price : 필수
  • status : 필수
    • paid
    • preparing delivery
    • on delivery
    • canceled
    • exchange
    • complete
  • destination : 필수
  • [FK] cart_id : 필수 → 카트 PK 참조 (주문할 아이템들을 담고 있는 카트 id)
  • [FK] user_id : 필수 → 사용자 PK 참조 (주문자)

3. ERD

 

  • user : order = 1 : M (비식별)
    • 하나의 user는 0개 이상의 order을 가질 수 있다.
    • 이때 usesr는 반드시 하나가 있어야 하고, user의 id 속성을 FK로 참조한다.
  • user : cart = 1 : 1 (식별)
    • user는 하나의 cart만을 가질 수 있고, cart 역시 하나의 user만 가질 수 있다.
    • 이때, cart는 user id를 FK로 참조한다.
    • user 없이는 cart가 존재할 수 없기 때문에 FK로 참조한 user id를 PK로 사용하는 식별관계이다.
  • cart : order = 1 : M
    • 하나의 cart에서 0개 이상의 order을 가질 수 있으며 cart는 반드시 하나가 있어야 한다.
    • order가 cart_id를 FK로 참조한다.
  • category : product = 1 : M
    • product는 하나의 category를 가지며 category는 여러 개의 product를 가질 수 있다.
    • produc가 category id를 FK로 참조한다.
  • product : item = 1 : M
    • product는 여러 개의 item을 가질 수 있다. 즉, product의 stock 만큼 item 개체를 갖는다.
    • item은 product id를 FK로 참조한다.
  • cart : item = 1 : M
    • cart는 0개 이상의 item이 cart id를 FK로 참조할 수 있다.
    • cart에 담긴 item이 없을 수 있다.
    • item은 하나의 물리적 상품 그 자체를 의미하는 개체이기 때문에 하나의 cart에만 담길 수 있다. (다른 카트에 중복해서 담길 수 없음)

4. SQL script

-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema shoppingdb
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema shoppingdb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `shoppingdb` DEFAULT CHARACTER SET utf8 ;
USE `shoppingdb` ;

-- -----------------------------------------------------
-- Table `shoppingdb`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `shoppingdb`.`user` (
  `id` INT NOT NULL,
  `pw` VARCHAR(45) NOT NULL,
  `type` VARCHAR(45) NOT NULL DEFAULT 'consumer',
  `name` VARCHAR(45) NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `shoppingdb`.`category`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `shoppingdb`.`category` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `shoppingdb`.`product`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `shoppingdb`.`product` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(45) NOT NULL,
  `price` INT NOT NULL,
  `stock` INT NOT NULL DEFAULT 1,
  `desc` VARCHAR(45) NULL,
  `category_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_product_category_idx` (`category_id` ASC) VISIBLE,
  CONSTRAINT `fk_product_category`
    FOREIGN KEY (`category_id`)
    REFERENCES `shoppingdb`.`category` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `shoppingdb`.`cart`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `shoppingdb`.`cart` (
  `id` INT NOT NULL,
  `items_cnt` INT ZEROFILL NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_cart_user2_idx` (`id` ASC) VISIBLE,
  CONSTRAINT `fk_cart_user2`
    FOREIGN KEY (`id`)
    REFERENCES `shoppingdb`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `shoppingdb`.`item`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `shoppingdb`.`item` (
  `product_id` INT NOT NULL,
  `id` INT NOT NULL AUTO_INCREMENT,
  `cart_id` INT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_item_product1_idx` (`product_id` ASC) VISIBLE,
  INDEX `fk_item_cart1_idx` (`cart_id` ASC) VISIBLE,
  CONSTRAINT `fk_item_product1`
    FOREIGN KEY (`product_id`)
    REFERENCES `shoppingdb`.`product` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_item_cart1`
    FOREIGN KEY (`cart_id`)
    REFERENCES `shoppingdb`.`cart` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `shoppingdb`.`order`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `shoppingdb`.`order` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `date` DATETIME NOT NULL,
  `total_price` INT NOT NULL,
  `status` VARCHAR(45) NOT NULL DEFAULT 'paid' COMMENT 'Paid\nPreparing delivery\nOn delivery\nCanceled\nExchange\nComplete\n',
  `destination` VARCHAR(45) NOT NULL,
  `user_id` INT NOT NULL,
  `cart_id` INT NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_order_user1_idx` (`user_id` ASC) VISIBLE,
  INDEX `fk_order_cart1_idx` (`cart_id` ASC) VISIBLE,
  CONSTRAINT `fk_order_user1`
    FOREIGN KEY (`user_id`)
    REFERENCES `shoppingdb`.`user` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_order_cart1`
    FOREIGN KEY (`cart_id`)
    REFERENCES `shoppingdb`.`cart` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

 

  • cmd에서 mysql 접속하기 (mac OS)
$ brew services start mysql
$ mysql -uroot -p(password)

 

  • database 확인하기 
mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| shoppingdb         |
| sys                |
+--------------------+
5 rows in set (0.00 sec)


mysql> use shoppingdb;

mysql> show tables;
+----------------------+
| Tables_in_shoppingdb |
+----------------------+
| cart                 |
| category             |
| item                 |
| order                |
| product              |
| user                 |
+----------------------+
6 rows in set (0.01 sec)