데이터베이스의 종류, 관련 개념들
아래 대부분의 내용은 도서 빅데이터를 지탱하는 기술에서 발췌했습니다.
이번 포스트에서는 pivot, 행/열 지향 데이터베이스, MPP, 스타 스키마, 비정규화 테이블을 다룹니다.
Pivot
- DB에 저장/관리가 쉬운 형태인
transaction table
을cross table
로 바꾸어주는 것 - transaction table
Data | Item | Cost |
---|---|---|
08-06 | A | $100 |
08-07 | B | $50 |
08-08 | B | $50 |
- cross table
08-06 | 08-07 | |
---|---|---|
Item | A | B |
Cost | $100 | $50 |
- pandas의
pivot_table()
사용
>>> df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
... "bar", "bar", "bar", "bar"],
... "B": ["one", "one", "one", "two", "two",
... "one", "one", "two", "two"],
... "C": ["small", "large", "large", "small",
... "small", "large", "small", "small",
... "large"],
... "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
... "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})
>>> df
A B C D E
0 foo one small 1 2
1 foo one large 2 4
2 foo one large 2 5
3 foo two small 3 5
4 foo two small 3 6
5 bar one large 4 6
6 bar one small 5 8
7 bar two small 6 9
8 bar two large 7 9
>>> table = pd.pivot_table(df, values='D', index=['A', 'B'],
... columns=['C'], aggfunc=np.sum)
>>> table
C large small
A B
bar one 4.0 5.0
two 7.0 6.0
foo one 4.0 1.0
two NaN 6.0
행 지향 데이터베이스
column-oriented
- 일반적으로 업무 시스템에서 사용되는 데이터베이스는 레코드 단위의 읽고 쓰기에 최적화되어있음
- 대량의 트랜잭션을 지연 없이 처리하기 위해 데이터 추가를 효율적으로 할 수 있도록 함
- 새로운 레코드를 추가할 경우에는 끝부분에 추가되므로 고속으로 쓰기 가능
- 데이터 검색을 고속화하기 위해
index
사용 - RDB가 이에 해당
열 지향 데이터베이스
- 데이터 분석에서는 어떤 column이 사용되는지 미리 알 수 없다. 일부 column만 집계 대상이 된다. 행 지향 데이터베이스에서는 필요없는 데이터까지 로드되어 디스크 I/O가 증가할 수 있음
- index가 도움이 되지 않음
- 데이터의 압축 효율도 우수
- 같은 coulumn에는 유사한 데이터가 나열되기 때문
- e.g.) 같은 문자열의 반복
- 같은 coulumn에는 유사한 데이터가 나열되기 때문
MPP 데이터베이스
- 행 지향 데이터베이스에서는 보통 하나의 쿼리는 하나의 스레드에서 실행된다.
- 여러개의 코어를 쓰더라도 개별 쿼리가 분산 처리 되는 것은 아님
- 반면, 열 지향 데이터베이스에서는 디스크에서 대량의 데이터를 읽기 때문에 쿼리 실행 시간이 길어지고, 압축된 데이터의 전개 등으로 CPU resource를 많이 필요로 한다.
- 멀티 코어를 활용해 고속화하는 것이 좋음!
-
MPP
에서는 하나의 쿼리를 다수의 작은 태스크로 분해하고 이를 가능한 병렬로 실행함- e.g.) 1억 레코드의 합을 구해야한다면, 10만 레코드 * 1,000개의 태스크로 나눈다. 독립적으로 각각의 합계를 집계해 마지막에 모든 결과를 모아 summation을 구함
- MPP는 고속화를 위해 CPU, 디스크 모두를 균형있게 늘려야함
- 열 지향 데이터베이스와 MPP 데이터베이스를 결합하면 데이터의 집계가 크게 고속화된다! 하지만, 그만큼 쿼리의 리소스 사용량도 많이 증가한다. 쿼리 실수로 인한 과부하 등 리소스 관리에 주의해야한다.
-
MPP Database
: 하드웨어 수준에서 데이터 집계에 최적화된 데이터베이스
처리량과 지연시간
- 데이터 처리의 성능은 1) 처리량, 2) 지연시간으로 표시된다.
-
처리량
: 일정 시간에 처리할 수 있는 데이터의 양- 데이터 웨어하우스/데이터 레이크에서는 대량의 데이터를 처리하기 위해 처리량을 중시해 설계
-
지연 시간
: 데이터 처리가 끝날 때까지의 대기 시간- 데이터 마트에서는 지연 시간의 단축이 요구됨
- 충분한 메모리 준비, 디스크 I/O 절감
대시보드 도구와 BI 도구
- 대시보드 도구: 새로운 그래프를 쉽게 추가하는데 중점
- Redash: SQL에 의한 쿼리 실행 결과를 그대로 시각화
- Superset: 대화형 대시보드 제작
- BI 도구: 대화형 데이터 탐색, 보다 시간을 들여 데이터를 자세히 보고 싶은 경우
- Tableau
트랜잭션과 마스터
-
Transaction
: 시간과 함께 생성되는 데이터- 한 번 기록되면 변하지 않음
-
Master
: 트랜잭션에서 참고되는 각종 정보- 각종 상황에 따라 다시 쓰임
데이터 웨어하우스의 스타 스키마
- Fact table: Transaction과 같이 사실이 기록된 것, 주로 집계의 기반이 되는 숫자 데이터
- Dimension table: 참고되는 마스터 데이터, 주로 데이터를 분류하기 위한 속성값
- 데이터 마트를 만들 때는 팩트 테이블을 중심으로 여러 디멘젼 테이블을 결합하는 것이 좋음
- 이러한 schema를
star schema
라고 함
- 이러한 schema를
- Fact table이 커지면 쿼리의 지연이 발생, 최대한 팩트 테이블을 작게하는 것이 고속화에 있어서 중요함
- 따라서, fact table에는 ID같은 키만을 남겨두고, 나머지는 dimension table로 옮김
- 앞서 언급했던 RDB의 장점!
데이터 마트의 비정규화 테이블
- 열 지향 스토리지를 갖는 시스템이 보급됨에 따라 컬럼의 수가 아무리 늘어나도 성능에 영향를 주지 않는다.
- 처음부터 팩트 테이블에 모든 컬럼을 포함해두고, 쿼리의 실행시에는 테이블 결합을 하지 않는 편이 간단함
- 따라서 데이터 마트에는 스타 스키마가 아니라
비정규화 테이블
을 사용하는 것이 바람직하다. -
비정규화 테이블
: 스타 스키마에서 좀 더 비정규화를 진행해 모든 테이블을 결함한 하나의 거대한 팩트 테이블
Dimension과 Measure
- Measure
- 숫자 데이터와 그 집계 방법을 정의하는 것
- e.g.) sum(“cost”)
- Dimension
- 크로스 집계에 있어서의 행과 열을 이용하는 것
- dimension으로 사용하는 데이터는 평소 정기적인 스냅샷으로 이력을 축적해두어야 한다.
- e.g.) 월별로 상품의 매출을 알고 싶다면?
- 측정값: 금액
- 디멘전: 판매일, 상품값
Cardinality
- 각 column이 취하는 값의 범위
- 취할 수 있는 값이 적은 것은 카디널리티가 작은 것
- e.g.) 성별은 카디널리티가 작고, IP주소는 크다
- 모든 칼럼의 카디널리티를 줄여야 테이블을 작게 집약할 수 있다.
- IP 주소와 같이 여러 값이 있는 것은 위치 정보로 변환하는 등 카디널리티를 줄여야된다.