MySQL

[MySQL] 41. 쇼핑몰 서비스 DB 구축 (2)

Song hyun 2024. 6. 12. 09:44
728x90
반응형

[MySQL] 41. 쇼핑몰 서비스 DB 구축 (2)

1. 쇼핑몰 카테고리 2단계

2. 예제 코드

3. 전체 코드


1. 쇼핑몰 카테고리 2단계

 

(1) 카테고리 테이블 설계

-자신보다 상위의 개념이 있을 수 있다.

ex: 남성복/여성복, 셔츠, 면바지라는 카테고리들이 있다면, 남성복/여성복이라는 상위 카테고리를 정하고, 그 아래에 셔츠와 면바지라는 하위 카테고리를 넣을 수 있을 것이다.

category_id parents_id category_name
1 null 남성복 (최상위 카테고리)
2 null 여성복 (최상위 카테고리)
3 1 팬츠 (남성복->팬츠)
4 2 팬츠 (여성복->팬츠)
5 1 셔츠 (남성복->셔츠)
6 2 셔츠 (여성복->셔츠)
7 3 면바지 (남성복->팬츠->면바지)
8 4 면바지 ( 여성복->팬츠->면바지 )
9 3 슬랙스 (남성복->팬츠-> 슬랙스)
10 4 슬랙스 (여성복->팬츠-> 슬랙스)

 

*만약 '팬츠'의 부모 id에 1,2를 동시에 넣으면, 데이터의 무결성에 위배된다.

=> '팬츠'라는 레코드를 두 개 만들어, 하나는 여성복 카테고리, 하나는 남성복 카테고리를 부모 카테고리로 지정한다.

=> '면바지' 역시, 레코드를 3개를 만들어 각각 여성복-팬츠/남성복-팬츠를 상위 카테고리로 지정한다.

 

 

(2) 프로덕트 테이블 설계

PRODUCT_ID PRODUCT_
NAME
CATEGORY_
ID
PRICE SIZE COLOR
102 남성 셔츠 4
(남성복-셔츠)
49,000 'L' '퍼플'
104 여성 셔츠 6
(여성복- 셔츠)
49,000 'L' '퍼플'
105 남성 면바지 7
(남성복-바지-면바지)
55,000 'M' '핑크'
106 남성 슬랙스 8 105,000 'XL' '샤인'
107 여성 면바지 9 55,000 'M' '핑크'
108 여성 슬랙스 10 105,000 'XL' '샤인'

 

* 남성 셔츠, 여성 셔츠 같은 프로덕트를 CATEGORY_ID와 JOIN할 때는, 최상위 카테고리가 아닌 바로 위의 카테고리를 JOIN해야 한다.


2. 예제 코드

 

(1) 카테고리 테이블 설계

create database demo3;

use demo3;

-- 카테고리 테이블 (상위, 하위 개념 추가)
create table tb_categories(
	CATEGORY_ID INT AUTO_INCREMENT PRIMARY KEY,
    PARENT_ID INT NULL,
    CATEGORY_NAME VARCHAR(100),	
    FOREIGN KEY(PARENT_ID) REFERENCES TB_CATEGORIES(CATEGORY_ID)
);

 

(2) 카테고리 테이블 - 데이터 삽입

-- 남성복의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('팬츠',1);    
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('셔츠',1);

-- 여성복의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('팬츠',2);    
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('셔츠',2);
    
-- 남성복 팬츠의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('면바지',3);
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('슬랙스',3);
    
-- 남성복 팬츠의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('면바지',5);
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('슬랙스',5);

 

 

(3) 프로덕트 테이블 설계

CREATE TABLE TB_PRODUCTS(
	PRODUCT_ID INT AUTO_INCREMENT PRIMARY KEY,
    PRODUCT_NAME VARCHAR(255),
    CATEGORY_ID INT,
    PRICE DECIMAL(10,2),
    SIZE VARCHAR(10),
    COLOR VARCHAR(50),
    FOREIGN KEY (CATEGORY_ID) REFERENCES TB_CATEGORIES(CATEGORY_ID)
);

 

 

(4) 프로덕트 테이블에 데이터 삽입

-- 남성복 상품 입력
INSERT INTO TB_PRODUCTS(PRODUCT_NAME,CATEGORY_ID,PRICE,SIZE,COLOR)
VALUES ('남성셔츠',4,49000,'L','퍼플'),
('남성면바지',7,55000,'M','핑크'),
('남성슬랙스',8,105000,'XL','샤인');

-- 여성복 상품 입력
INSERT INTO TB_PRODUCTS(PRODUCT_NAME,CATEGORY_ID,PRICE,SIZE,COLOR)
VALUES ('여성셔츠',6,49000,'L','퍼플'),
('여성면바지',9,55000,'M','핑크'),
('여성슬랙스',10,105000,'XL','퍼플');

 

(5) 응용 문제

-- 특정 카테고리에 속하는 모든 상품 조회
-- 1단계, 남성, 여성 팬츠에 속하는 상품을 모두 조회

-- 특정 카테고리에 속하는 모든 상품 조회
-- 1단계, 남성, 여성 팬츠에 속하는 상품을 모두 조회
SELECT P.PRODUCT_NAME,P.PRICE,P.SIZE,P.COLOR
FROM TB_PRODUCTS AS P
JOIN TB_CATEGORIES AS C ON P.CATEGORY_ID=C.CATEGORY_ID
WHERE C.CATEGORY_NAME='슬랙스';

 

 

-- 2단계, 만약 여성 면바지만 출력해야 한다면?
-- 서브쿼리를 이용해보자.
-- 서브쿼리: 쿼리 속의 쿼리

-- 2단계, 만약 여성 면바지만 출력해야 한다면?
-- 서브쿼리를 이용해보자.
-- 서브쿼리: 쿼리 속의 쿼리
SELECT P.PRODUCT_NAME,P.PRICE,P.SIZE,P.COLOR,C.PARENT_ID
FROM TB_PRODUCTS AS P
JOIN TB_CATEGORIES AS C ON P.CATEGORY_ID=C.CATEGORY_ID
WHERE C.CATEGORY_NAME='면바지' 
						AND c.parent_id=
                        (SELECT category_ID FROM TB_CATEGORIES 
                        WHERE category_name='팬츠' and parent_id=2);

3. 전체 코드

(1) 카테고리 테이블

create database demo3;

use demo3;

-- 카테고리 테이블 (상위, 하위 개념 추가)
create table tb_categories(
	CATEGORY_ID INT AUTO_INCREMENT PRIMARY KEY,
    PARENT_ID INT NULL,
    CATEGORY_NAME VARCHAR(100),	
    FOREIGN KEY(PARENT_ID) REFERENCES TB_CATEGORIES(CATEGORY_ID)
);

INSERT INTO TB_CATEGORIES(CATEGORY_NAME) VALUES('남성복');
INSERT INTO TB_CATEGORIES(CATEGORY_NAME) VALUES('여성복');

-- 남성복의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('팬츠',1);    
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('셔츠',1);

-- 여성복의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('팬츠',2);    
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('셔츠',2);
    
-- 남성복 팬츠의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('면바지',3);
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('슬랙스',3);
    
-- 남성복 팬츠의 하위 카테고리
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('면바지',5);
INSERT INTO TB_CATEGORIES(CATEGORY_NAME,PARENT_ID) 
	VALUES('슬랙스',5);
    
SELECT*FROM tb_categorieS;

 

(2) 프로덕트 테이블 및 연습문제

CREATE TABLE TB_PRODUCTS(
	PRODUCT_ID INT AUTO_INCREMENT PRIMARY KEY,
    PRODUCT_NAME VARCHAR(255),
    CATEGORY_ID INT,
    PRICE DECIMAL(10,2),
    SIZE VARCHAR(10),
    COLOR VARCHAR(50),
    FOREIGN KEY (CATEGORY_ID) REFERENCES TB_CATEGORIES(CATEGORY_ID)
);

-- 남성복 상품 입력
INSERT INTO TB_PRODUCTS(PRODUCT_NAME,CATEGORY_ID,PRICE,SIZE,COLOR)
VALUES ('남성셔츠',4,49000,'L','퍼플'),
('남성면바지',7,55000,'M','핑크'),
('남성슬랙스',8,105000,'XL','샤인');

-- 여성복 상품 입력
INSERT INTO TB_PRODUCTS(PRODUCT_NAME,CATEGORY_ID,PRICE,SIZE,COLOR)
VALUES ('여성셔츠',6,49000,'L','퍼플'),
('여성면바지',9,55000,'M','핑크'),
('여성슬랙스',10,105000,'XL','퍼플');

SELECT*FROM TB_PRODUCTS;

-- 특정 카테고리에 속하는 모든 상품 조회
-- 1단계, 남성, 여성 팬츠에 속하는 상품을 모두 조회
SELECT P.PRODUCT_NAME,P.PRICE,P.SIZE,P.COLOR
FROM TB_PRODUCTS AS P
JOIN TB_CATEGORIES AS C ON P.CATEGORY_ID=C.CATEGORY_ID
WHERE C.CATEGORY_NAME='슬랙스';

-- 2단계, 만약 여성 면바지만 출력해야 한다면?
-- 서브쿼리를 이용해보자.
-- 서브쿼리: 쿼리 속의 쿼리
SELECT P.PRODUCT_NAME,P.PRICE,P.SIZE,P.COLOR,C.PARENT_ID
FROM TB_PRODUCTS AS P
JOIN TB_CATEGORIES AS C ON P.CATEGORY_ID=C.CATEGORY_ID
WHERE C.CATEGORY_NAME='면바지' 
						AND c.parent_id=
                        (SELECT category_ID FROM TB_CATEGORIES 
                        WHERE category_name='팬츠' and parent_id=2);

SELECT PARENT_ID FROM TB_CATEGORIES WHERE category_name='팬츠';
SELECT PARENT_ID FROM TB_CATEGORIES 
	WHERE category_name='팬츠' and parent_id=2;
    
    
-- 문제 1. 남성복 셔츠만 출력하시오.
SELECT P.PRODUCT_NAME,P.PRICE,P.SIZE,P.COLOR
FROM TB_PRODUCTS AS P
JOIN TB_CATEGORIES AS C ON P.CATEGORY_ID=C.CATEGORY_ID
where c.category_name='셔츠' 
							and c.parent_id=
							(SELECT parent_id FROM TB_CATEGORIES 
                        WHERE category_name='셔츠' and parent_id=1);

-- 문제 2. 여성복 슬랙스만 출력하시오.
select P.PRODUCT_NAME,P.PRICE,P.SIZE,P.COLOR
from TB_PRODUCTS as p
join TB_CATEGORIES as c on p.CATEGORY_ID=c.CATEGORY_ID
where c.category_name='슬랙스' 
	and c.parent_id=
		(select category_id from TB_CATEGORIES
        where category_name='팬츠' and parent_id=2);
728x90
반응형