계산된 데이터 저장
애플리케이션 은 데이터베이스 에 저장된 소스 데이터에서 값을 도출해야 할 수 있습니다. 새 값을 계산하려면 특히 큰 데이터 세트의 경우나 여러 문서를 검사해야 하는 경우 상당한 CPU 리소스가 필요할 수 있습니다.
계산된 값이 자주 요청되는 경우에는 해당 값을 데이터베이스 에 미리 저장하는 것이 더 효율적일 수 있습니다. 애플리케이션 이 데이터를 요청할 때 읽기 작업은 한 번만 필요합니다.
이 작업에 대하여
읽기가 쓰기보다 훨씬 더 일반적인 경우 계산된 패턴 은 데이터 계산 빈도를 줄입니다. 애플리케이션 은 읽을 때마다 값을 계산하는 대신 계산된 값을 저장하고 필요에 따라 다시 계산합니다. 애플리케이션 은 계산된 값의 소스 데이터를 변경하는 쓰기 (write) 마다 또는 주기적인 작업 의 일부로 값을 다시 계산할 수 있습니다.
참고
주기적인 업데이트에서는 반환된 계산 값이 정확하지 않을 수 있습니다. 그러나 정확한 정확성이 요구되지 않는 경우 이 접근 방식은 성능을 개선할 가치가 있을 수 있습니다.
단계
이 예시 에서 애플리케이션 은 영화 뷰어 및 수익 정보를 표시합니다. 사용자는 특정 영화와 해당 영화로 얻은 수익을 조회할 수 있습니다.
샘플 데이터 삽입
screenings
컬렉션 을 만듭니다.
db.screenings.insertMany( [ { theater: "Alger Cinema", location: "Lakeview, OR", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 344, revenue: 3440 }, { theater: "City Cinema", location: "New York, NY", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 1496, revenue: 22440 }, ] )
계산된 데이터 삽입
사용자는 종종 특정 영화를 본 사람의 수와 해당 영화로 얻은 수익을 알고 싶어합니다. 현재 스키마 에서 num_viewers
및 revenue
를 추가하려면 제목이 'Lost in the Shadows'인 영화를 상영한 극장에 대한 읽기를 수행하고 해당 필드의 값을 합산해야 합니다.
정보가 요청될 때마다 해당 계산을 수행하지 않으려면 총 값을 계산하여 영화 기록 자체와 함께 movies
컬렉션 에 저장 수 있습니다.
db.movies.insertOne( { _id: 1, title: "Lost in the Shadows", total_viewers: 1840, total_revenue: 25880 } )
업데이트된 계산된 데이터
screenings
컬렉션 에 새로운 심사가 추가되었다고 가정해 보겠습니다.
db.screenings.insertOne( { theater: "Overland Park Cinema", location: "Boise, ID", movie_title: "Lost in the Shadows", movie_id: 1, num_viewers: 760, revenue: 7600 } )
movies
컬렉션 의 계산된 데이터는 더 이상 현재 선별 데이터를 반영하지 않습니다. 계산된 데이터를 업데이트 하는 빈도는 애플리케이션 에 따라 다릅니다.
쓰기 (write) 작업량이 적은 환경에서는
screenings
데이터의 모든 업데이트 와 함께 계산이 발생할 수 있습니다.쓰기가 더 정기적인 환경에서는 정의된 간격( 예시: 매시간)으로 계산을 수행할 수 있습니다.
screenings
의 소스 데이터는movies
컬렉션 에 대한 쓰기의 영향을 받지 않으므로 언제든지 계산을 실행 수 있습니다.
스크리닝 데이터를 기반으로 계산된 데이터를 업데이트 하려면 다음 집계 을 정기적으로 실행 하면 됩니다.
db.screenings.aggregate( [ { $group: { _id: "$movie_id", total_viewers: { $sum: "$num_viewers" }, total_revenue: { $sum: "$revenue" } } }, { $merge: { into: { db: "test", coll: "movies" }, on: "_id", whenMatched: "merge" } } ] )
결과
계산된 패턴 은 CPU 워크로드 를 줄이고 애플리케이션 성능을 향상시킵니다. 애플리케이션 이 동일한 계산을 반복적으로 수행하고 읽기 대 쓰기 (write) 비율이 높은 계산된 패턴 을 고려하세요.