캡스톤 프로젝트 데이터베이스 구조 설계
이번 캡스톤 프로젝트에서 우리 팀은 Firestore와 Storage를 이용해 데이터베이스를 구축하기로 결정했다. 오늘은 Firestore 구조를 설계하는 회의를 진행했다. 완성된 구조는 다음과 같다.
User data
collection : user
- document : user id
- 닉네임 nickname (string)
- 마지막 앱 사용 날짜 lastAccessDate (timestamp)
- 연속 출석 일수 consecutiveAccessDays (int)
- 사용자 고유 음성 voice (map) → Storage의 저장 위치 URL
- 사용자 음성 파일은 Storage에 저장 후, Firestore에 Storage URL 저장
- 최근 연습 대본 las (reference) → 코드상에서 controller로 최근 연습한 대본 id 들고 다니기
- sub collection : practice
- document : script id
- 한문장 스크랩 scrapSentence (List)
- 프롬프트 결과 promptResult (List<Map<String, dynamic>>)
- 연습 날짜 practiceDate : (timestamp)
- 정확도 precision : (int)
Example Script data
collection : example_script
- document : script id (자동생성)
- 제목 title (string)
- 카테고리 category (string)
- 내용 content (List)
- 생성일자 createdAt (timestamp)
User Script data
collection : user_script
- document : user id
- sub collection : script
- document : script id (자동생성)
- 제목 title (string)
- 카테고리 category (string)
- 내용 content (List)
- 생성일자 createdAt (timestamp)
설계 시 고려한 점
- Firestore의 복합 색인은 최대 2개까지 가능하다.
- collection을 가져올 때, sub collection까지 같이 가져와지지 않는다. 각 collection은 상하 관계여도 별도로 쿼리를 작성해야한다.
- Firebase를 무료 요금제로 사용할 것이기 때문에, 쿼리 수나 용량 제한 상한선을 고려해야 한다.
소감
쿼리 수, 코드, 용량 등 고려해야 하는 부분이 많아 설계가 어려웠다. 구조가 너무 복잡해지는 것을 우려해 기획이 일부 변경되기도 했다. NoSQL에 대한 이해도가 부족하다고 느껴 공부를 더 해보려 한다.