Bookmark profile
데이터 구조 모델링

Document Database를 사용하는 경우, 데이터 구조를 설계하기 위해서는 가장 먼저 내 앱이 어떻게 데이터를 다루어야 하는지를 알아야 한다.

예를들어, 내 정보를 등록하고, 내 기록을 작성할 예정이며, 기록의 양은 수만개 이상일 수 있다. 라고 한다면 데이터의 구조는 절대 임베드 형식으로 하면 안된다.

반대로, 내 정보를 등록하고, 내 기록을 작성할 예정이지만, 기록은 인당 10개로 제한한다. 라고 한다면 데이터의 구조는 임베드 형식으로 하는 것이 참조 형식으로 하는 것보다 훨씬 효과적일 것이다.

그래서 앞으로 만들 앱이 어떻게 데이터를 사용할 지를 먼저 정의해야한다.

데이터 구조 모델링 – 데이터 사용방법 및 관계 정의하기

내 앱에서는 사용자, 꿈, 목표, 할일에 대한 데이터를 다룰 예정이다. 이 4가지의 데이터를 기준으로 데이터간의 관계를 어떻게 연결할 것인지를 알아보자.

사용자 – 꿈: One-to-Few

사용자 마다 꿈은 여러개일 수 있다. 하지만, 너무 많은 꿈을 등록하고 사용하는것은 추천하지 않기 때문에 10개정도로 제한을 둔다. 따라서 이런 경우에는 임베드 구조를 사용하는것이 좋다. (One-to-Few)

꿈 – 목표: One-to-Many

꿈은 그 꿈을 이루기 위한 목표들을 가지는데, 이 목표들은 100개 이하 정도로 예상하고 있다. 예를들어, 내가 바디프로필을 찍는 것이 꿈이라고 한다면, 체지방 5%, 몸무게 80kg 과 같은 목표들이 있을 것이다. 따라서, 이런 경우에는 참조를 쓰되, 아이디 배열을 사용하는 구조로 하는 것이 좋다. (One-to-Many)

목표 – 할 일: One-to-Squillions

목표에 따라서 할 일을 설정할 수 있는데, 이러한 할 일은 어마어마하게 많아질 수 있다. 하루에 할 일 뿐만 아니라 월간/주간으로 가져와서 다루는 경우가 많기 때문이다. 따라서 이것은 위에서 다루었던 아침 기록과 동일하게 할일 안에 목표 아이디를 넣는 방식의 참조를 권장한다. (One-to-Squillions)

데이터 구조 모델링 – 데이터 스키마의 옵셔널 데이터 정의하기

옵셔널 데이터란, 같은 테이블의 데이터 구조를 따르면서 특정 컬럼만 전혀 다른 데이터 구조를 가지는 경우를 의미한다. 나는 내가 만들 앱에서 할 일을 다양하게 제공할 예정이다.

할 일 – 아침 기록

확언, 시각화, 오늘의 목표, 식단, 오늘 읽을 도서, 오늘을 나타내는 이미지 등의 데이터를 입력하는 화면을 제공한다.

할 일 – 물 마시기

물을 총 몇컵/몇리터 마시는지 기록할 수 있는 데이터를 입력하는 화면을 제공한다.

할 일 – 운동하기

어떤 운동을 몇회 하는지, 또는 한 세트에 어떤 운동들을 몇회 하는지, 이어서 몇 세트 진행했는지에 대한 데이터를 입력하는 화면을 제공한다.

이렇게 다양한 구조로 할 일을 관리할 수 있도록 도와주기 위해서 나는 할 일 스키마를 상속받는 다양한 형태의 데이터 구조를 만들었다.

export type Todo = {
  id?: string;
  name?: string;
  type:
      | 'normal'
      | 'record-of-day'
      | 'drink-water'
      | 'exercise';
};

// 하루를 기록하기
export type RecordOfDay = Todo & { ... }

// 물 마시기
export type DrinkWater = Todo & { ... }

// 운동하기
export type Exercise = Todo & { ... }

이렇게 하면, 보다 다양한 UI로 할 일을 관리할 수 있는 템플릿을 제공할 수 있다. 내가 원하는 하루의 시작을 기록으로 진행하는 것 또한 이 구조로 만들면 가능하다.

참조