서비스

[랭체인 중간프로젝트] 데이터베이스 설계 병합 전 체크

hurwan 2026. 8. 31. 16:48

2026-08-31 15:54:13

데이터베이스 리뷰

현재 제가 직접 작성하고 gpt한테 제약조건을 넣어달라 요청을 한 상태로 한번 리뷰를 해보겠습니다.

목차

  1. 개요
  2. service 스키마
  3. datasets 스키마

1. 개요

일단 service 스키마의 테이블은 총 12개로

사용자 및 일반 서비스

  • users: 사용자 기본
  • user_profiles: 사용자 러닝 선호도
  • running_goals: 주간/월간 목표
  • inquries: 문의경로 찾기 및 추천
  • route_bookmarks: 사용자가 즐겨찾기한 경로
  • point_bookmarks: 경유지 즐겨찾기
  • route_requests: 사용자의 요청 정보
  • route_request_points: 요청 정보에 달려있는 출발/목적지 포인트
  • route_recommendations: 추천 경로 후보 (현재는 3개)
  • route_points: 추천 경로 후보에 달려있는 포인트들 N개 (많을 수 있음)사용자 추적
  • running_sessions: 사용자 러닝 1개 기록
  • running_trackpoints: 사용자 러닝 기록 하나에 대해서 주기적으로 뽑은 gps 및 기타 정보

가 존재하며 datasets스키마는 총 8개 존재합니다.

  • convenience_stores: 편의점
  • public_toilets: 공중화장실
  • streetlights: 가로등
  • security_lights: 보안등
  • cctvs: CCTV
  • parks: 도시공원 (polygon은 가능하면 넣기)
  • pedestrian_roads: 보행자 전용 도로

2. service.* 테이블

 

users

로그인 아이디는 UNIQUE로 존재하며 탈퇴 시 사용자의 아이디는 withdraw_[id]_<random>으로 갈 예정입니다.

전화번호는 이때 NULLALE로 삭제시키며 UNIQUE 또한 넣을 생각입니다.

사용자가 정지를 먹을 때에는 영구정지를 당할 수 있으며 이때에는 status=SUSPENDED, suspended_until=NULL 상태가 됩니다. 이외의 경우에는 status=SUSPENDED, suspended_until=????-??-?? 상태이빈다.

user_profiles

사용자가 러닝을 할 때 서버에서 참고할 값입니다. 사용자마다 선호도가 다르기 때문에 이를 다르게 설정할 예정입니다.

users 테이블과 1:1 매칭이며 weight, height 는 기본으로 받고, 알고리즘 및 데이터에 따라 running_settings 형태를 바꿀 예정입니다.

profile_image_url은 서버에 하드코딩을 박아둔 뒤 랜덤으로 이미지를 제공하는 형태로 사용할 예정입니다. 또는 프론트에서 직접 고정 이미지를 보여주는 방식을 사용할 수 있습니다.

running_settings를 더 구체적으로 잡을 필요가 있는데 일단 이건 그대로 두고 늦어도 수요일까지 수정하는 방향으로 가려고 합니다.

running_goals

사용자가 월간 또는 주간 러닝 목표로 잡을 수 있게 만들 예정이며 일부러 기간은 2가지만 만들엇기 때문에 goal_typeWEEKLYMONTHLY 2가지만 존재합니다.

사용자가 아무때나 시작 및 종료가 가능하며 상태에 따라 종료 시간, 실패 시간, status 등이 설정되게 됩니다.

NULLABLE 한 finished_at가 존재합니다.

point_bookmarks

그냥 사용자가 임시로 빠르게 찾아가기 위한 point 와 name 가 붙어잇는 데이터입니다.

route_requests

사용자의 프롬프트, 알고리즘 입력 조건(사용자가 입력할수도 있고, llm이 넣어준 것일 수 있습니다.)

selected_recommendations_idx는 사용자가 선택하기 전까지는 NULL이며 사용자가 중간에 앱을 끄면 특별한 일이 없으면 영원히 NULL로 남게 됩니다.

route_request_points

사용자 요청에 N개로 달려있는 포인트입니다.

route_recommendations

알고리즘이 생성한 경로 후보로 메타데이터가 존재하며 정확히 지나는 지점들은 아래에 존재합니다.

route라는 전체 연결 geometry(LineString, 4326) 가 존재합니다.

route_points

후보 경로에 포함된 주요 지점입니다.

route_bookmarks

러닝 코스 자체를 북마크 합니다. 특별한 내용은 없습니다.

running_sessions

사용자의 러닝 기록을 대표하는 내용입니다.

처음에는 NULL이였다가 기록 시에 running_trackpoints로 집계되는 average_pace가 있습니다.

running_trackpoints

주기적으로 프론트에서 보내주거나 캐싱하여 한번에 주는 사용자 러닝 실시간 기록입니다.

inquiries

사용자가 요청/관리자가 답변하는 내용입니다.

특별한 내용은 없습니다. 딱히 알람 등과도 연동되지 않습니다.

3. datasets.* 테이블

정제한 .csv 파일을 DB에 올린 테이블들 입니다.

 

테이블은 아래와 같습니다.

  • convenience_stores: 편의점
  • public_toilets: 공중화장실
  • streetlights: 가로등
  • security_lights: 보안등
  • cctvs: CCTV
  • parks: 도시공원 (polygon은 가능하면 넣기)
  • pedestrian_roads: 보행자 전용 도로

가 있으며 모두 위경도 데이터이며 마지막의 보행자 전용 도로는 geometry(LineString, 4326)이 포함되어있습니다.

또한 parks의 겨우에는 데이터를 찾아서 polygon으로 만들면 좋지 않을까 생각합니다.

모든 geometry 데이터에는 index가 붙어져있습니다. (초기에 데이터를 많이 넣고 수정은 사용자 사용시에 거의 일어나지 않기 때문입니다.)