DB를 어떤 것으로 사용할까?

yeezze·2022년 12월 9일
2

form 프로젝트

목록 보기
1/7

고민

프로젝트 시작 단계에서 가장 처음으로 고민했던 내용이 DB를 어떤 것으로 사용할까?였습니다.
처음에는 매번 프로젝트에서 사용해와서 친숙한 RDBMS 사용을 고려했습니다.

먼저 DB ERD 구조에 대해서 도메인을 생각하며 그려보아야합니다.

해당 프로젝트는 선착순 설문지 폼을 작성하는 페이지를 개발합니다.
설문지의 형식은 정해져있지 않고 사용자가 원하는대로 추가하거나 삭제할 수 있습니다. 질문 개별의 옵션 갯수 또한 사용자가 원하는대로 추가 및 삭제가 가능합니다.
또한 현재는 질문 유형에 단답형, 객관식 질문 밖에 없지만 사진 첨부, 다중 선택, 장문형 등 여러 유형이 추가될 가능성이 있습니다.

결정

정리해보자면 해당 도메인은 스키마가 일정하게 정해져있지 않고 사용자가 원하는대로 매번 다르게 정해집니다. 또한 다양한 유형의 스키마가 추가될 가능성이 있습니다. (비정형 데이터가 추가될 수도 있음)
해당 프로젝트의 선착순 응답 폼은 제출 후에 수정 작업이 존재하지 않습니다. 때문에 RDBMS에서 제공해주는 ACID 트랜잭션을 사용할 기능이 없고 데이터의 일관성을 관리할만한 필요성이 적다고 판단했습니다.

이러한 특징 때문에 RDBMS 보다는 nosql이 적합하다는 생각이 들었습니다.

물론 추상클래스를 활용한다면 RDBMS로도 구현은 가능할 것 같습니다.
그러나 도메인의 특징인 확장성, 비구조성 등을 고려하여 nosql로 구현하기로 결정했습니다.

DB는 nosql을 사용하여 구현하자!

nosql을 처음 사용해보고자 했기 때문에 구체적인 DB 종류를 고민하면서 쉽고 간편하게 접근 및 사용할 수 있는 MongoDB로 결정했습니다. atlas를 활용하면 aws의 RDS처럼 무료로 클라우드 MongoDB를 사용할 수 있습니다.

데이터 구조

# Form Collection
{
    "_id": ObjectId("4586darwmv2bb"),
    "title": “가을 간식행사”,        
    "description" : "많이많이 참여해주세용",
    "startTime": ~,
    "endTime": ~,
    "winnersNumber": 20,
    "questions": [            ← 또 다른 도큐먼트를 가리킴. 변경이 없기 때문에 embed로 설계,
        {
            "_id" : ObjectId("sdf7814fbb"),
            "title" : "학번",
            "type" : "text"
        },
        {
            "_id" : ObjectId("32tkhg4fbb"),
            "title" : "증명사진",
            "type" : "images"
        },
        {
            "_id" : ObjectId("tdg98khg4fbb"),
            "title" : "골라보세요",
            "type" : "checkbox",
            "content" : [
                "1번", "2번", "3번", "4번"
            ]
        }
    ],
    "url" : “http://~~~”,
    "status" : ACTIVE       // ACTIVE, INACTIVE
}

# Answer Collection
{
    "_id" : ObjectId("bogh0875tsbb"),
    "userId" : "~~~",
    "content" : "1928371",      // text, 이미지 url
    "formId" : ObjectId("4586darwmv2bb"),
    "questionId" : ObjectId("sdf7814fbb")
}

Form(설문지), Question(질문), Answer(응답) 3개의 Collection으로 구성되어 있습니다.
설문지와 질문은 한번에 조회될 가능성이 높은 데이터들이기 때문에 임베디드 형식으로 스키마 관계를 설정했습니다.
Answer(응답) 컬렉션안의 관계들은 레퍼런스 형식으로 설정했습니다.
선착순 설문지 특성 상 동시에 무수히 많은 응답이 제출(insert)될 수도 있고 Form, Question 컬렉션과 조인하여 한번에 select하는 작업이 없기 때문에 별도의 컬렉션으로 빼는 것이 좋다고 생각했습니다.

참고

https://meetup.nhncloud.com/posts/276

profile
백엔드 개발자 😊

0개의 댓글