프로젝트의 시작인 하루입니다.
이것저것 참 많은 일들이 있었지만, 오늘은 하루종일 꽂혀 있던 Firebase realTimeDataBase
의 설계, No SQL - document
에 대한 내용으로 작성할까 합니다.
기존 RDB
와는 좀 달리 생각해야 하는데, 마냥 쉽지 않아서 좀 난항을 겪고 있습니다.
또한 firebase
의 경우 쿼리문을 통한 접근을 따로 지원하지 않고, 다양한 메소드를 통해 DB
자료를 검색할 수 있습니다.
관계가 정의된 상태가 아닐 때 data
를 어떻게 저장해야 할까?
저장된 데이터를 어떻게 메소드를 덜 사용하면서 효율적으로 가져올 수 있을까?
Date
데이터를 보관한다면 key
를 어떻게 설정하는게 좋을까?
이런저런 고민이 참 많았습니다.
숙소 예약을 담당했던 전 프로젝트 팀원에게 조언을 구할까 했지만, 한 번 혼자 힘으로 첫 DB
설계를 시작해보고자 합니다.
우선 No SQL
은 정말 말 그대로 설계하기 나름인 것 같습니다.
스키마도 존재하지 않고, 그렇기에 PK, FK
등과 같은 제약도 없습니다.
따라서 확장하고 싶으면 마음껏 하는게 맞지만, 최적화는 다른 문제입니다.
firebase
의 경우 document, JSON
형태의 DB
구조입니다.
원하는 결과를 위해 하나의 특정 key로 접근하는 구조로 만들어진 것이죠.
"저장해야 할 대부분의 데이터는 Date String
이기에 이를 년, 월, 주 단위로 최적화하기 위해 데이터를 옮기는 방법은 어떨까?" 가 바로 첫번째 생각이었습니다.
그러나 해당 방법은 각 key의 value가 서로 의존성을 갖게 됩니다.
예를 들어,
일별 데이터를 주(key)에 담는다.
월요일에는 주를 초기화하고, 특정 월(9)에 주 데이터를 담는다.
다음 월로 넘어가는 10.01 00:00에 월을 reset하고, 특정 년에 월 데이터를 담는다.
가 되는데, 이렇게 될 경우 너무 번거롭고 지나치게 많은 로직을 발생시키는 것 같았습니다.
따라서 해당 방법은 가차없이 폐기했습니다.
예상 구조는
{
userId : {
userInfo : {...},
year : {"1" : [...], ..., },
month : {"1st" : [...], ..., },
week : [{...}],
day : {start : "", end : "", time : number},
},
userId : {...},
}
이런 느낌이었는데, 모르니까 참 용감한 것 같습니다.
코드로 써보니까 정말 택도 없네요.
다음 방법은 그냥 틀을 빡세게 잡고 가는 방법입니다.
{
userId : {
userInfo : {...},
"2021" : {
"1" : {
"1st": {
"Mon" : {
"start" : Date,
"end" : Date,
"time" : number,
},
...
},
...
},
...
},
"2022" : {...}
}
}
이런 느낌이 되겠네요.
그리고 이걸 한 번 더 묶어버리면,
{
userId : {
userInfo : {...},
commuteData : {
"2021" : {
"1" : {
"1st": {
"Mon" : {
"start" : Date,
"end" : Date,
"time" : number,
},
...
},
...
},
...
},
"2022" : {...}
}
}
}
가 되는 것이 아닐까 생각합니다.
그럼 년, 월, 주, 요일로 각각 따로 접근할 수 있기는 합니다.
firebase method는 하나의 dir 경로로 접근하는 것과 같은 방식으로 데이터에 접근하게끔 구성되어 있습니다.
그런데 사실 아직 이게 개발 단계에서 옳은 방법인가에 대해 검증하지는 못한 것 같습니다.
이것저것 No SQL에 대해 공부하고 있는데, 어떤게 효율적일지 잘 모르겠습니다.
저는 아직까지는 이렇게 구성하는게 좋을 것 같다는 생각이 고정적인 것 같습니다.
접근에 용이하고, 로직에서 활용도가 높은 구조일 것 같아서 그런 것 같습니다.
무지의 늪에 빠져 도전하고 깨져봐야 아나봅니다...
그럼 오늘도 깨져보러 가겠습니다! 화이팅!