[MongoDB] Modeling 5.SubsetPattern

기훈·2024년 4월 7일

MongoDB

목록 보기
8/28

배달 어플 주문 리뷰 서비스

  • 가게를 만들고 800개의 리뷰를 생성. 리뷰는 배열 혈태로 삽입
    db.shops.insertOne({
        _id: 1,
        name: "Tommy Steak House",
        desc: "Greatest Steak House Ever.",
        phone: "000-0000-1234",
        reviews: [
            {
                review_id: 1,
                user: "James",
                review: "So Good!!",
                date: new Date(),
                rating: 10
            },
            {
                review_id: 2,
                user: "Tommy",
                review: "Not Bad.",
                date: new Date(),
                rating: 7
            },
            {
                review_id: 3,
                user: "Kevin",
                review: "Yummy!!",
                date: new Date(),
                rating: 5
            },
        ]
    })

문제점

  • 여러 음식점을 클릭해서 리뷰를 확인할 때
    음식점 클릭 -> find -> 내부적으로 캐시의 있는지 확인 후(없다면 캐시에 적재) 도큐먼트 반환
    따라서 캐시에 올라가는 데이테인 Working Set은 Shop collection 전체가 되고, 너무 큰 Working Set으로 인한 cache eviction이 발생

개선하기

  • Working Set을 줄인다 -> 도큐먼트의 사이즈를 줄인다 -> 사용자의 패턴을 분석한다.
    예시) 음식점을 클릭하고 리뷰를 확인할 때 모든 리뷰를 보는 것이 아닌 최신 5~10개 정보만 저장한다.
    설계) 리뷰 데이터의 일부(최신)만 shop 컬렉션에 저장하고, 나머지는 리뷰 컬렉션에 저장한다.

    review = {
        review_id: 800,
        user: generateRandomString(5),
        review: generateRandomString(10),
        date: new Date(),
        rating: Math.floor(Math.random() * 10)
    }
    db.reviews.insertOne(review) // 리뷰 컬렉션을 생성하여 리뷰 데이터를 저장
    db.shops.updateOne(
        {
            _id: 2
        },
        {
            $push: {
                reviews: {
                    $each: [review],
                    $slice: -10 // 새로운 리뷰가 작성되었을 때, 모든 리뷰가아닌 최신 10개의 리뷰만 보여준다
                }
            }
        }
    )
    
    db.reviews.find()
    db.shops.find()


    (가게를 검색했을 떄, 모든 리뷰가 아닌 최신 몇개의 리뷰만 보여지게 된다.)

0개의 댓글