장비의 이벤트 데이터에는 변경된 속성 정보만 포함되어 있는데 DB 에는 몇가지 이유로 해당 시점의 모든 속성들을 다 채워넣어 저장해줘야 한다.
즉, 해당 장비의 최종 정보를 DB 에서 가져온 후 이벤트가 발생한 속성값만 변경해서 추가 저장(insert)하는 방식.
DB 조회를 줄이기 위해 발생 빈도, 장비 종류/건수 등에 따라 간단하게 직접 구현하거나 Redis 를 이용해서 처리했었는데 데이터를 이원화하면서 기존 방식을 재검토해봤다.
- 시계열 DB 에 가공하지 않고 이벤트 데이터 그대로 저장.
- 일정 주기로 시계열 DB에서 신규 데이터셋 구한 뒤 애플리케이션에서 속성 채워넣는 처리 후 조회용 DB 에 벌크 인서트.
기존 소스 재활용 염두에 두고 위 방식으로 생각 풀어 가고 있었는데 같이 논의하던 한 분이 raw 데이터 그대로 저장한 뒤 일괄 업데이트하는게 구조도 단순해지고 성능도 오히려 나을 수 있겠다는 의견을 내셔서 검토해보기로 했다.
검토 작업 일환으로 직전 정보로 null 속성 일괄 채워넣어서 업데이트하는 SQL 문 테스트.
Oracle 에서는 'LAST_VALUE(컬럼 IGRNORE NULLS)' 같은 방식으로 좀 더 간단하게 이 문제 해결할 수 있는 듯 한데 postgresql 이나 mariadb 는 윈도우 함수에서 IGRNORE NULLS 옵션 지원하지 않아서 sum(case when 컬럼 is null then 0 else 1 end) 과 같은 트릭을 이용해야 하는 듯.
장단점이 있지만 애플리케이션 단에서 구현할 때 추가로 해결해야할 문제들 한 방에 해결해주니 확실히 구조는 깔끔해질 듯 하다.
이러니 RDB 에서 벗어나기가 참 쉽지 않다 ㅎ
'Data' 카테고리의 다른 글
Oracle DB에서 주기적으로 데이터를 정확하게 5초 간격으로 추출 (0) | 2020.07.28 |
---|---|
[MySQL]시간 올림, 내림 (0) | 2020.07.14 |
[Python]pandas 의 to_sql 이용한 Bulk insert (0) | 2020.07.07 |
InfluxDB vs. TimescaleDB (0) | 2020.06.17 |
cassandra DB GUI 클라이언트로 DBeaver community 이용하기 (0) | 2020.06.11 |