프로젝트 개요
- 쇼핑몰 데이터베이스 미니 프로젝트
- 2021.04.13 ~
- 데이터베이스
- MySQL
MySQL을 이용해서 쇼핑몰 데이터베이스를 구축해보는 미니 프로젝트입니다.
Database Mini Project :
쇼핑몰 데이터베이스 요구사항 분석
1. 사이트맵
- 랜딩 페이지
- 회원가입
- 로그인
- 관리자 계정 로그인
- 상품 등록 페이지
- 구매자 계정 로그인
- 쇼핑 카트 페이지
- 관리자 계정 로그인
- 상품 카테고리 네비게이션
- 상품 카테고리 1
- 상품 디테일 1
- 주문 페이지
- 또는 쇼핑 카트 페이지로 이동 (구매자 계정 로그인 한 경우에만 접근 가능)
- 상품 디테일 2
- ...
- 상품 디테일 1
- 상품 카테고리 2
- 상품 디테일 1
- 상품 디테일 2
- ...
- ...
- 상품 카테고리 1
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)
'프로젝트' 카테고리의 다른 글
[HTML/SCSS/Typescript 프로젝트] Wordle Game (0) | 2022.05.16 |
---|---|
[React 프로젝트] JSON 작성을 돕는 UI / JSON Builder (0) | 2021.11.16 |
[React 프로젝트] react-chart-js2를 이용한 React Dashboard (0) | 2021.04.12 |
[React 프로젝트] React 포트폴리오 템플릿 (0) | 2021.04.12 |
[데이터 관리 프로그램/Python] What's in my Refrigerator : 냉장고 속 식재료 데이터 관리 프로그램 (0) | 2021.04.09 |