Search
🛳️

2. 차원 모델링

a) 비즈니스 프로세스 선택

현재 ERD를 통해 도출될 수 있는 서비스는 무엇이 있을까? 도메인을 나누어 몇가지 정리해 보있다.
사용자 도메인
사용자 가입 및 탈퇴
계좌 도메인
계좌 개설 및 해지
예수금 입금 및 출금
종목 매수 후 보유
주문 도메인
주식 주문 요청
체결 도메인
매수/매도 호가 등록
체결 시 체결 결과 전달
미체결 시 장 마감 후 일괄 처리
미체결 결과 전달
종목 도메인
종목 상장 및 상장폐지
종목 별 재무 업데이트
종목 별 리포트 업데이트
이런 서비스들 중 비즈니스 성과에 대한 지표가 될 수 있는 프로세스를 선택하였다.
사용자 도메인
사용자 가입 및 탈퇴
어떤 사용자 혹체결 시 체결 결과 전달은 특정 유형의 사용자가 서비스에 가입하는 것을 성과 지표로 사용할 수 있다.
계좌 도메인
계좌 개설
어떤 계좌 혹은 특정 유형의 계좌가 개설되는 것을 성과 지표로 사용할 수 있다.
예수금 입금 및 출금
특정 유형의 계좌에 고액의 예수금을 입금하고 출금하는 것을 성과 지표로 사용할 수 있다.
주문 도메인
주식 주문
주문량의 증감을 성과 지표로 사용할 수 있다.
체결 도메인
체결 시 체결 결과 전달
체결 시 청구되는 수수료를 성과 지표로 사용할 수 있다.
비즈니스 성과 산출에 당장 필요하진 않지만, 차후 분석에 도움될 수 있는 프로세스는 다음과 같다.
체결 도메인
매수/매도 호가 등록
미체결 시 장 마감 후 일괄 처리
미체결 결과 전달
시스템 장애 혹은 악의적인 사용을 인지하고 방지할 수 있다.
종목 도메인
종목 상장 및 상장폐지
종목 별 재무 업데이트
종목 별 리포트 업데이트
데이터 분석 혹은 머신러닝을 통해 시장 동향에 대해 인사이트를 얻을 수 있다.
종목 데이터 오픈 API를 제공하여 부수적인 수입원을 만들 수 있다.
각 비즈니스 프로세스의 속성은 다음과 같이 정리된다. 설계할 팩트 유형을 굵은 글씨로 표시하였다.
분석 예시
관련 부서
테이블 변화
가능한 팩트 유형
주기
사용자 가입
사용자 유형 분류, 프로모션 성과 측정
고객 관리, 홍보
고객 테이블 행 insert
트랜잭션, 스냅샷, 누적 스냅샷
가입 활동, 매일, 일, 주, 월별
계좌 개설
개설 계좌 유형 분류, 프로모션 성과 측정
고객 관리, 홍보
계좌 테이블 행 insert, 계좌 테이블 행 update
트랜잭션, 스냅샷, 누적 스냅샷
계좌 개설 활동, 매일, 일, 주, 월별
예수금 입출금
주요 사용자 분류, 재무 계획 참고, 투자 상품 성과 측정
고객 관리, 홍보, 재무
계좌 테이블 행 update
트랜잭션
매 잔액 변동
주식 주문
주요 사용자 분류, 첫 주문 추적 거래소 성과 측정, 시스템 이상 감지
고객 관리, 홍보, 경영, 시스템 운영 관리
주문 테이블 행 insert
트랜잭션, 스냅샷, 누적 스냅샷
매 주문 장 마감 후 일, 주, 월 별
체결 및 결과 전달
재무 정산, 거래소 성과 측정, 시스템 이상 감지
재무, 경영, 시스템 운영 관리
체결 테이블 행 insert
트랜잭션, 스냅샷, 누적 스냅샷
매 체결 장 마감 후 일, 주, 월 별

b) 그레인 정의

하나의 비즈니스 프로세스 당 하나의 그레인을 정의한다. 물리적으로 가능한 선에서 최대한 자세하게 정의하는것이 좋다.
사용자 가입 및 탈퇴
계좌 개설
속성
도메인
타입
고객번호
고객
str
비밀번호
고객
str
고객상태
고객
code
고객유형
고객
code
이메일
고객
str
전화번호
고객
str
성별
고객
code
나이
고객
num
생일
고객
date
수입
고객
num
투자성향
고객
code
데이터생성일시
고객
timestamp
데이터변경일시
고객
timestamp
예수금 입금 및 출금
속성
도메인
타입
고객번호
고객
str
비밀번호
고객
str
고객상태
고객
code
고객유형
고객
code
이메일
고객
str
전화번호
고객
str
성별
고객
code
나이
고객
num
생일
고객
date
수입
고객
num
투자성향
고객
code
데이터생성일시
고객
timestamp
데이터변경일시
고객
timestamp
계좌번호
계좌
str
계좌상태
계좌
code
계좌유형
계좌
code
계좌명
계좌
str
계좌비밀번호
계좌
str
개설일자
계좌
date
해지일자
계좌
date
출금가능금액
계좌
num
예수금
계좌
num
데이터생성일시
계좌
timestamp
데이터변경일시
계좌
timestamp
종목티커
보유
str
보유개수
보유
num
총매수가격
보유
num
데이터생성일시
보유
timestamp
데이터변경일시
보유
timestamp
입출금 구분
입출금
code
금액
입출금
num
체결 시 체결 결과 전달
속성
도메인
타입
고객번호
고객
str
비밀번호
고객
str
고객상태
고객
code
고객유형
고객
code
이메일
고객
str
전화번호
고객
str
성별
고객
code
나이
고객
num
생일
고객
date
수입
고객
num
투자성향
고객
code
데이터생성일시
고객
timestamp
데이터변경일시
고객
timestamp
계좌번호
계좌
str
계좌상태
계좌
code
계좌유형
계좌
code
계좌명
계좌
str
계좌비밀번호
계좌
str
개설일자
계좌
date
해지일자
계좌
date
출금가능금액
계좌
num
예수금
계좌
num
데이터생성일시
계좌
timestamp
데이터변경일시
계좌
timestamp
종목티커
보유
str
보유개수
보유
num
총매수가격
보유
num
데이터생성일시
보유
timestamp
데이터변경일시
보유
timestamp
종목티커
종목
str
거래소코드
종목
str
종목상태
종목
code
종목명
종목
str
종목설명
종목
str
종목섹터
종목
code
상장일자
종목
date
데이터생성일시
종목
timestamp
데이터변경일시
종목
timestamp
분기
재무
str
수익
재무
num
운영비
재무
num
순이익
재무
num
순이익률
재무
num
EBITDA
재무
num
데이터생성일시
재무
timestamp
데이터변경일시
재무
timestamp
전일종가
현황
num
시가
현황
num
고가
현황
num
저가
현황
num
거래량
현황
num
데이터생성일시
현황
timestamp
데이터변경일시
현황
timestamp
주문일련번호
주문
str
주문일자
주문
date
매도매수구분
주문
code
체결일련번호
체결
str
체결일자
체결
date
구매계좌
체결
str
판매계좌
체결
str
체결수량
체결
num
체결금액
체결
num
수수료
체결
num
데이터생성일시
체결
timestamp
데이터변경일시
체결
timestamp
속성
도메인
타입
고객번호
고객
str
비밀번호
고객
str
고객상태
고객
code
고객유형
고객
code
이메일
고객
str
전화번호
고객
str
성별
고객
code
나이
고객
num
생일
고객
date
수입
고객
num
투자성향
고객
code
데이터생성일시
고객
timestamp
데이터변경일시
고객
timestamp
계좌번호
계좌
str
계좌상태
계좌
code
계좌유형
계좌
code
계좌명
계좌
str
계좌비밀번호
계좌
str
개설일자
계좌
date
해지일자
계좌
date
데이터생성일시
계좌
timestamp
데이터변경일시
계좌
timestamp
주식 주문
속성
도메인
타입
고객번호
고객
str
비밀번호
고객
str
고객상태
고객
code
고객유형
고객
code
이메일
고객
str
전화번호
고객
str
성별
고객
code
나이
고객
num
생일
고객
date
수입
고객
num
투자성향
고객
code
데이터생성일시
고객
timestamp
데이터변경일시
고객
timestamp
계좌번호
계좌
str
계좌상태
계좌
code
계좌유형
계좌
code
계좌명
계좌
str
계좌비밀번호
계좌
str
개설일자
계좌
date
해지일자
계좌
date
출금가능금액
계좌
num
예수금
계좌
num
데이터생성일시
계좌
timestamp
데이터변경일시
계좌
timestamp
종목티커
보유
str
보유개수
보유
num
총매수가격
보유
num
데이터생성일시
보유
timestamp
데이터변경일시
보유
timestamp
종목티커
종목
str
거래소코드
종목
str
종목상태
종목
code
종목명
종목
str
종목설명
종목
str
종목섹터
종목
code
상장일자
종목
date
데이터생성일시
종목
timestamp
데이터변경일시
종목
timestamp
분기
재무
str
수익
재무
num
운영비
재무
num
순이익
재무
num
순이익률
재무
num
EBITDA
재무
num
데이터생성일시
재무
timestamp
데이터변경일시
재무
timestamp
전일종가
현황
num
시가
현황
num
고가
현황
num
저가
현황
num
거래량
현황
num
데이터생성일시
현황
timestamp
데이터변경일시
현황
timestamp
주문일련번호
주문
str
주문일자
주문
date
주문상태
주문
code
매도매수구분
주문
code
주문수량
주문
num
주문가격
주문
num
데이터생성일시
주문
timestamp
데이터변경일시
주문
timestamp

c) 차원 테이블 식별

여러개의 팩트 테이블을 가지는 차원 모델에서 통일된 차원 테이블의 식별은 좋은 선택이다. 차원 테이블을 하나씩 정의해 나가면서 전사적으로 통일된 버스 아키텍쳐를 그려본다.
1. 날짜 차원
시계열로 생성되는 비즈니스 측정지표를 나타내는 차원 모델은 날짜 차원이 필수적이다.
속성
타입
역할
날짜 키
num
PK
날짜
str
날짜 상세
str
요일
str
str
일 수
num
주차
str
str
월 수
num
월 이름
str
년도
num
분기
str
분기 수
num
월말일 구분
str
공휴일 구분
str
주말 구분
str
Date 포맷
date
공휴일과 주말의 분류 값을 평일/공휴일, 평일/주말의 자연어 형태로 테이블에 저장하도록 하였다.
BI 애플리케이션에서 플래그 값을 디코딩 하는것 보다 데이터 베이스 자체에 자연스러운 분류 값을 두는것이 차원 모델링의 목적에 더욱 부합한다.
영업사원부터 DBA까지 DW를 사용하는 모든 부서와 사용자들이 데이터를 사용할 때 일치성을 보장받을 수 있기 때문이다.
버스 아키텍쳐 - 날짜 차원
날짜 차원
사용자 가입
가입 날짜
계좌 개설/해지
개설/해지 날짜
예수금 입출금
입/출금 날짜
주식 주문
주문 날짜
체결 및 결과 전달
체결 날짜
2. 사용자 차원
사용자 차원은 CRM 측면에서 매우 중요한 차원이다. 고객의 첫 구매, 누적 구매한 금액, 주문 빈도 등 다양한 분석 요구사항에 따라 그 컬럼이 수백개가 될 수도 있다. 아웃리거 차원과 메저를 적절하게 사용한다면 분석 부하를 방지하고 사용자 친화적인 차원 모델을 설계할 수 있다.
사용자 차원이 커버하는 분석 시나리오는 다음과 같은 시나리오 등이 있다.
사용자 나이 별 투자 성향
사용자 성별 별 수입 분포
속성
타입
역할
고객 키
num
PK
고객번호
str
NK
고객상태
code
고객유형
code
이메일
str
전화번호
str
성별
code
나이
code
생일
date
수입
code
투자성향
code
데이터유효일시
timestamp
SCD2
데이터만기일시
timestamp
SCD2
데이터유효성
boolean
SCD2
비밀번호와 같은 민감성 데이터는 차원 테이블에서 삭제하였다.
SCD Type 2를 적용하여 변경 이력을 관리하였다.
데이터유효일시는 고객이 최초로 서비스에 등록한 시간으로, SQL 쿼리 시 BETWEEN 쿼리 좌변의 기준 일자로 활용된다.
데이터만기일시는 스냅샷 기록 시의 데이터최종변경일시 값을 사용한다.
데이터유효성은 해당 사용자의 최신의 데이터가 삽입되면(ETL 작업에서, 과거 스냅샷의 데이터유효일시가 최신 스냅샷의 데이터유효일시보다 과거라면) 이전에 삽입된 행의 데이터유효성 값이 false로 갱신된다.
버스 아키텍쳐 - 사용자 차원
날짜 차원
사용자 차원
사용자 가입
가입 날짜
가입한 사용자
계좌 개설/해지
개설/해지 날짜
계좌 주
예수금 입출금
입/출금 날짜
계좌 주
주식 주문
주문 날짜
주문자
체결 및 결과 전달
체결 날짜
주문자
3. 계좌 차원
계좌 차원에서는 보유 종목이 1:N 관계로 계좌 차원과 연결되어있다. 이 관계를 브릿징을 통해 나타내어본다.
계좌가 보유한 종목의 포트폴리오를 분석할 때 브리지 테이블이 도움될 수 있다. 하지만 복잡한 분석쿼리와 ETL의 난이도를 고려한다면 그다지 좋은 선택이 아닐 수 있다.
예컨데 보유하고있는 종목들 중 가장 많은 금액을 가진 종목의 산업 섹터를 선택하거나, 특정 섹터의 종목 보유율 구간 분석을 진행한다면 데이터의 카디널리티를 낮추고 희소성(sparsity)을 높일 수 있다.이렇게 한다면 하나의 아웃리거 차원이나 미니 차원 테이블을 통해 유의미한 분석을 진행할 수 있을것이다.
계좌 차원이 커버하는 분석 시나리오는 다음과 같은 시나리오 등이 있다.
계좌 잔액에 따른 보유 섹터 경향
사용자 유형에 따른 보유 종목 포트폴리오 분석
속성
타입
유형
계좌 키
num
PK
계좌번호
str
NK
계좌상태
code
계좌유형
code
계좌명
str
개설일자
date
해지일자
date
출금가능금액
num
예수금
num
데이터유효일시
timestamp
SCD2
데이터만기일시
timestamp
SCD2
데이터유효성
boolean
SCD2
계좌 브리지
속성
타입
유형
계좌 키
num
FK
보유종목 키
num
FK
데이터유효일시
timestamp
SCD2
데이터만기일시
timestamp
SCD2
데이터유효성
boolean
SCD2
보유 종목 차원
속성
타입
유형
보유종목 키
num
PK
종목티커
str
보유개수
num
총매수가격
num
데이터유효일시
timestamp
SCD2
데이터만기일시
timestamp
SCD2
데이터유효성
boolean
SCD2
버스 아키텍쳐 - 계좌 차원
날짜 차원
사용자 차원
계좌 차원
사용자 가입
가입 날짜
가입한 사용자
X
계좌 개설/해지
개설/해지 날짜
계좌 주
계좌 정보
예수금 입출금
입/출금 날짜
계좌 주
계좌 정보, 보유 종목
주식 주문
주문 날짜
주문자
주문 계좌, 보유 종목
체결 및 결과 전달
체결 날짜
주문자
주문 계좌, 보유 종목
4. 종목 차원
종목 데이터는 재무와 현황, 두 갈래의 계층구조로 이루어져있다. 분기마다 갱신되는 재무 데이터는 SCD Type 3을 적용하여 1, 2, 3, 4분기, 1년, 2년, 3년 전의 재무 속성 값을 종목 데이터가 가지도록 하였다. 매일마다 갱신되는 현황 데이터는 다른 차원으로 따로 빼내어 SCD Type 2를 적용하였다.
현황 데이터가 데이터 분석에 큰 의미가 없다고 판단한다면 DW가 아닌 DL에 스냅샷을 적재해도 될 것 같다.
종목 차원이 커버하는 분석 시나리오는 다음과 같은 시나리오 등이 있다.
종목 주문 시 사용자 투자 성향에 따른 재무 특징
계좌 잔액에 따른 우상향/우하향 종목 주문 경향
속성
타입
유형
종목 키
num
PK
종목티커
str
NK
거래소코드
str
종목상태
code
종목명
str
종목설명
str
종목섹터
code
상장일자
date
1Q 전 수익
num
SCD3
1Q 전 운영비
num
SCD3
2Q 전 수익
num
SCD3
2Q 전 운영비
num
SCD3
3Y 전 EBITDA
num
SCD3
종목 현황 차원
속성
타입
유형
종목 현황 키
num
PK
종목티커
str
NK
전일종가
num
시가
num
고가
num
저가
num
거래량
num
데이터유효일시
timestamp
SCD2
데이터만기일시
timestamp
SCD2
데이터유효성
boolean
SCD2
버스 아키텍쳐 - 종목 차원
날짜 차원
사용자 차원
계좌 차원
종목 차원
종목 현황 차원
사용자 가입
가입 날짜
가입한 사용자
X
X
X
계좌 개설/해지
개설/해지 날짜
계좌 주
계좌 정보
X
X
예수금 입출금
입/출금 날짜
계좌 주
계좌 정보, 보유 종목
X
X
주식 주문
주문 날짜
주문자
주문 계좌, 보유 종목
주문 종목
주문 종목 현황
체결 및 결과 전달
체결 날짜
주문자
주문 계좌, 보유 종목
주문 종목
X

d) 팩트 테이블 식별

1. 사용자 가입
그레인에서 차원 테이블에 속한 속성을 제하면 다음이 남는다.
속성
데이터생성일시
데이터변경일시
팩트 테이블
데이터생성일시를 날짜 차원으로 이관하고 필요하지 않은 데이터변경일시를 제한 팩트 테이블은 다음과 같다.
속성
타입
역할
차원
비고
가입일자 키
num
FK
날짜
사용자 키
num
FK
사용자
2. 계좌 개설
그레인에서 차원 테이블에 속한 속성을 제하면 다음이 남는다.
속성
데이터생성일시
데이터변경일시
팩트 테이블
속성
타입
역할
차원
비고
개설일자 키
num
FK
날짜
사용자 키
num
FK
사용자
계좌 키
num
FK
계좌
3. 예수금 입출금
그레인에서 차원 테이블에 속한 속성을 제하면 다음이 남는다.
속성
입출금 구분
금액
데이터생성일시
데이터변경일시
팩트 테이블
속성
타입
역할
차원
비고
입출금일자 키
num
FK
날짜
사용자 키
num
FK
사용자
계좌 키
num
FK
계좌, 보유종목
입출금 구분
num
금액
num
measure
4. 주식 주문
그레인에서 차원 테이블에 속한 속성을 제하면 다음이 남는다.
속성
도메인
타입
주문일련번호
주문
str
주문일자
주문
date
주문상태
주문
code
매도매수구분
주문
code
주문수량
주문
num
주문가격
주문
num
데이터생성일시
주문
timestamp
데이터변경일시
주문
timestamp
팩트 테이블
속성
타입
역할
차원
비고
주문일자 키
num
FK
날짜
주문자 키
num
FK
사용자
주문계좌 키
num
FK
계좌, 보유종목
주문종목 키
num
FK
종목
종목현황 키
num
FK
종목 현황
주문일련번호
str
NK
퇴화차원
주문상태
code
매도매수구분
code
주문수량
num
measure
주문가격
num
measure
5. 체결 및 결과 전달
그레인에서 차원 테이블에 속한 속성을 제하면 다음이 남는다.
속성
도메인
타입
주문일련번호
주문
str
주문일자
주문
date
주문상태
주문
code
매도매수구분
주문
code
주문수량
주문
num
주문가격
주문
num
체결일련번호
체결
str
체결일자
체결
date
구매계좌
체결
str
판매계좌
체결
str
체결수량
체결
num
체결금액
체결
num
수수료
체결
num
데이터생성일시
체결
timestamp
데이터변경일시
체결
timestamp
팩트 테이블
체결 일자와 주문 일자는 거의 같지만, 장외 거래와 같이 아닌 경우도 고려하기 위해 두개의 차원 뷰를 롤플레잉 차원으로 설계하였다.
ETL을 통해 구매계좌와 판매계좌를 식별할 수 있으므로 이 또한 롤플레잉 차원으로 설계하였다.
속성
타입
역할
차원
비고
체결일자 키
num
FK
체결날짜
롤플레잉
주문일자
num
FK
주문날짜
롤플레잉
주문자 키
num
FK
사용자
주문계좌 키
num
FK
주문계좌, 보유종목
롤플레잉
상대계좌
num
FK
상대계좌
롤플레잉
주문종목 키
num
FK
종목
주문일련번호
str
NK
퇴화차원
체결일련번호
str
NK
퇴화차원
매도매수구분
code
체결수량
num
measure
체결금액
num
measure
수수료
num
measure