[MongoDB] Modeling 1.너무 큰 배열 문제

기훈·2024년 4월 5일

MongoDB

목록 보기
4/28

회원이 많은 OLTP성 카페의 요구사항을 구현하고 모델링을 진행 해보자.

1. 카페 컬렉션에 유저 정보를 Embedding

  • 카페라는 컬렉션에 members라는 배열 필드를 만들어 유저가 카페에 가입할 때마다 배열에 유저를 추가한다.

    db.cafe.insertMany([
      {
        _id: 1,
        name: "IT Community",
        desc: "A Cafe where developer's share information.",
        created_at: ISODate("2018-08-09"),
        last_article: ISODate("2022-06-01T10:56:32.000Z"),
        level: 5,
        members: [
          {
            id: "tom93",
            first_name: "Tom",
            last_name: "Park",
            phone: "000-0000-1234",
            joined_at: ISODate("2018-09-12"),
            job: "DBA",
          },
          {
            id: "asddwd12",
            first_name: "Jenny",
            last_name: "Kim",
            phone: "000-0000-1111",
            joined_at: ISODate("2018-10-02"),
            job: "Frontend Dev",
          },
        ],
      },
      {
        _id: 2,
        name: "Game Community",
        desc: "Share information about games.",
        created_at: ISODate("2020-01-23"),
        last_article: ISODate("2022-06-02T10:56:32.000Z"),
        level: 4,
        members: [
          {
            id: "tom93",
            first_name: "Tom",
            last_name: "Park",
            phone: "000-0000-1234",
            joined_at: ISODate("2020-09-12"),
            job: "DBA",
          },
        ],
      },
    ]);
  • id가 2번인 카페에 유저를 10만명을 추가한 후, 카페 컬렉션의 데이터 크기를 확인

    // 바이트이기 때문에 값을 나누어 출력, 약 13.361040115356445MB
    db.cafe.stats().size / 1024 / 1024;
  • 분석

    만약 현재 모델링에서 유저가 계속 증가하면 어떻게 될까? 실제로 유저 데이터를 더 생성해서 넣으려고 시도했을 때 insert 속도가 현저히 줄어들거나 실행되지 않을 것이다. 하나의 도큐먼트의 최대 크기는 16MB이기 때문이다.

  • 결과

    • 카페에 가입한 멤버를 임베딩(도큐먼트의 배열필드에 전부 삽입)
    • 카페서비스처럼 회원수가 계속 늘어나는 요구사항에서 배열로 모델링하는 것은 적합하지 않다.
    • 현재 모델링으로는 13만명 정도가 최대일 것으로 예상된다. (10만명에 13.36바이트를 차지했다)

0개의 댓글