Data Analysis/FCMM

fcmm테이블 모델링

mansoorrr 2023. 7. 18. 13:57

스크래핑을 통해 수집한 데이터 구조는 다음과 같다.

 

처음 table을 만들때에 정확하게 모델링을 하지 않고 시작했기 때문에 동일한 컬럼들이 겹쳐있어 어지럽다.

 

1. 대분류, 중분류, 소분류 컬럼이 category, product 두개의 테이블에 공통으로 존재한다. category_code만들어서 해결한다.

 

먼저 category 테이블의 데이터를 조회해본다. 아래와 같이 35개의 데이터가 도출됐다

SELECT * FROM CATEGORY;

 

category segment subsegment
럭키데이 티셔츠  
럭키데이 팬츠  
베스트    
신상품    
프로모션    

 

원래 수집했던 테이블은 놔두고 싶기 때문에 category 테이블의 세개 컬럼을 하나의 뭉치로 하는 간단한 category_code컬럼이 만들어진 테이블을 다시 생성한다. 코드와 결과는 아래와 같다.

CREATE TABLE IF NOT EXISTS CATEGORY_UNIQUE
SELECT *
FROM (
	SELECT category, segment, subsegment, LPAD(no, '3', '0') AS CATEGORY
    FROM (
    	SELECT *, @ROWNUM := @ROWNUM+1 AS no
        FROM CATEGORY, (SELECT @ROWNUM:=0) r
    ) A
)C;

 

category segment subsegment category_code
럭키데이 티셔츠   001
럭키데이 팬츠   002
베스트     003
신상품     004
프로모션     005

 

product table의 경우 category code를 만들어주고 product2 라는 새로운 테이블을 만들어 준다.

이를위해 product 테이블을 기준으로 category 테이블과 left조인하여 category_code컬럼을 만들어 주고 select를 통해 필요한 컬럼만 추출한다. 이후 create table을 통해 테이블을 생성한다. 코드와 결과는 아래와 같다.

CREATE TABLE IF NOT EXISTS PRODUCT2
SELECT *
FROM (
	SELECT category_code, PRODUCT_NAME, PRODUCT_CODE, ORG_PRICE, DISCOUNT_PCT, DISCOUNT_PRICE, REVIEW_NUM, URL
	FROM PRODUCT P LEFT JOIN CATEGORY_UNIQUE C
		ON P.category = C.category
		AND P.segment = c.segment
		AND P.subsegment = C.subsegment
	ORDER BY PRODUCT_CODE
) F;
category_code product_name product_code org_price discount_pct discount_price review_num url
001 fcmmxrdvz-유니콘-티셔츠-블랙 4019 49000 24500 50 0 /product/fcmmxrdvz-유니콘-티셔츠-블랙/4019/category/1000/display/1/
001 어웨이큰-프로그-티셔츠-화이트 4020 49000 24500 50 0 /product/어웨이큰-프로그-티셔츠-화이트/4020/category/1000/display/1/
001 아윌-런-티셔츠-화이트 4021 42000 21000 50 0 /product/아윌-런-티셔츠-화이트/4021/category/1000/display/1/
001 아윌-런-티셔츠-블랙 4022 42000 21000 50 0 /product/아윌-런-티셔츠-블랙/4022/category/1000/display/1/
001 써니-데이-티셔츠-화이트 4023 42000 21000 50 0 /product/써니-데이-티셔츠-화이트/4023/category/1000/display/1/

 

이제 category_unique 테이블과 product2 테이블의 관계를 설정한다.

category_unique의 category_code를 pk / product2의 category_code를 fk로 설정한다.

ALTER TABLE CATEGORY_UNIQUE ADD CONSTRAINT PRIMARY KEY(category_code);
ALTER TABLE PRODUCT2 ADD CONSTRAINT FOREIGN KEY(category_code) REFERENCES category_unique(category_code);

2. 컬럼명을 모두 대문자로 통일한다. 아래 쿼리를 실행해서 문자로된 쿼리를 반환시키고 반환한 결과를 복사하여 다시 실행한다. category_unique 테이블과 product2 테이블 모두 적용한다.

<category_unique>

SELECT
    CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `',
        UPPER(COLUMN_NAME), '` ', COLUMN_TYPE, ';')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='CATEGORY_UNIQUE';
ALTER TABLE category_unique CHANGE `CATEGORY` `CATEGORY` varchar(20);
ALTER TABLE category_unique CHANGE `SEGMENT` `SEGMENT` varchar(20);
ALTER TABLE category_unique CHANGE `SUBSEGMENT` `SUBSEGMENT` varchar(20);
ALTER TABLE category_unique CHANGE `CATEGORY_CODE` `CATEGORY_CODE` varchar(3);

<product2>

SELECT
	CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `',
    	COLUMN_NAME, '` `', UPPER(COLUMN_NAME),'`', COLUMN_TYPE, ';')
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='PRODUCT2';
ALTER TABLE product2 CHANGE `CATEGORY_CODE` `CATEGORY_CODE`varchar(3);
ALTER TABLE product2 CHANGE `PRODUCT_NAME` `PRODUCT_NAME`varchar(100);
ALTER TABLE product2 CHANGE `PRODUCT_CODE` `PRODUCT_CODE`varchar(20);
ALTER TABLE product2 CHANGE `ORG_PRICE` `ORG_PRICE`int;
ALTER TABLE product2 CHANGE `DISCOUNT_PCT` `DISCOUNT_PCT`int;
ALTER TABLE product2 CHANGE `DISCOUNT_PRICE` `DISCOUNT_PRICE`int;
ALTER TABLE product2 CHANGE `REVIEW_NUM` `REVIEW_NUM`int;
ALTER TABLE product2 CHANGE `URL` `URL`varchar(200);

 

모델링한 데이터 기반으로 분석 및 시각화 시작

https://hiphan-mansoorrr.tistory.com/13