1) 산책 정보 저장 구현

산책 정보를 저장하려면, 테이블이 최소 2개 이상 필요하다

  1. WALK_RECORDS 테이블
id integer [pk, increment]
pet_id integer [not null, ref: > PETS.id]
start_time time // 산책 시작 시간
end_time time // 산책 종료 시간
duration time // 산책 시간 기록 -> 고민 [종료 - 시작] 으로 구현할지 저장해놓을지
created_at date [not null] // 날짜
  1. WALK_POINTS 테이블
id integer [pk, increment]
walk_record_id integer [not null, ref: > WALK_RECORDS.id]
latitude double
longitude double

동작 예제 [관계형 테이블로 작성한 경우]

pet_id가 1번인 반려동물이 산책을 시작한다.

2024-08-19 '오전 10:00' 에 시작 - '오전 10:20' 에 산책 종료

'2분마다 한 번'씩 '경도', '위도' 값을 저장하여 `WALK_POINTS` 테이블에 기록한다.

WALK_RECORDS

id pet_id start_time end_time duration created_at distance
1 1 10:00 10:20 20 2024-08-19 1.3km

WALK_POINTS

id walk_record_id latitude longitude
1 1 100.1 100.2
2 1 100.2 100.2
3 1 100.3 100.2
4 1 100.4 100.3
5 1 100.5 100.3
6 1 100.6 100.4
7 1 100.7 100.5
8 1 100.8 100.6
9 1 100.8 100.6
10 1 100.9 100.7

→ 위와 같은 경우에 단순히 산책을 한 번 했을 뿐인데, DB에 WRITE 연산이 10번이나 일어난다

→ 사용자 100명이 동시에 사용한다면 10 * 100 = 1,000 개의 레코드가 생성되게 된다.

→ 이러한 점이 비효율적이라고 생각…

생각한 해결 방법

1) 관계형 DB로 구현

  1. 일정 시각마다 저장하는 경도 & 위도 정보를 DB column에 저장하지 않고, Redis 와 같은 공간에 String 이나 Array 형식으로 저장한다.