산책 정보를 저장하려면, 테이블이 최소 2개 이상 필요하다
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] // 날짜
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 개의 레코드가 생성되게 된다.
→ 이러한 점이 비효율적이라고 생각…
경도 & 위도 정보를 DB column에 저장하지 않고, Redis 와 같은 공간에 String 이나 Array 형식으로 저장한다.