속성 패턴으로 데이터 그룹화
속성 패턴 특히 필드가 공통된 특성을 주식 경우 유사한 필드가 많은 문서를 구성하는 데 도움이 되는 스키마 설계 패턴 입니다. 유사한 필드의 이러한 하위 집합을 정렬하거나 쿼리 해야 하는 경우 속성 패턴 사용하여 스키마 최적화할 수 있습니다. 문서 당 여러 개의 유사한 필드를 키-값 하위 문서로 통합하여 문서 인덱싱 더 쉽게 만듭니다. 여러 개의 유사한 필드에 여러 개의 인덱스를 만드는 대신 속성 패턴 사용하면 더 적은 수의 인덱스를 만들 수 있으므로 쿼리를 더 빠르고 간단하게 쓰기 (write) 수 있습니다.
컬렉션 에 다음 조건이 적용 경우 속성 패턴 사용합니다.
정렬하거나 쿼리 공유된 특성을 가진 유사한 필드가 많이 포함된 대규모 문서가 있습니다.
문서의 작은 하위 집합에는 정렬에 필요한 필드가 포함되어 있습니다.
이 작업에 대하여
영화 컬렉션 생각해 보겠습니다. 컬렉션 의 일반적인 문서는 다음과 같습니다.
db.movies.insertOne( { "_id": 1, "title": "Star Wars", "runtime": 121, "directors": ["George Lucas"], release_US: ISODate("1977-05-20T01:00:00+01:00"), release_France: ISODate("1977-10-19T01:00:00+01:00"), release_Italy: ISODate("1977-10-20T01:00:00+01:00"), release_UK: ISODate("1977-12-27T01:00:00+01:00") } )
위 문서 에서 여러 국가에 대한 출시하다 날짜 필드를 확인합니다. 출시하다 을 검색 하려면 한 번에 여러 필드를 살펴보아야 합니다. 속성 패턴 없으면 출시하다 날짜를 빠르게 검색하려면 movies
컬렉션 에 여러 인덱스를 만들어야 합니다.
db.movies.createIndex({ release_US: 1 }); db.movies.createIndex({ release_France: 1 }); db.movies.createIndex({ release_Italy: 1 }); db.movies.createIndex({ release_UK: 1 });
그러나 인덱스는 비용이 많이 들고 특히 쓰기 (write) 작업의 경우 성능이 저하될 수 있습니다. 다음 절차에서는 다양한 출시하다 날짜의 정보 하위 집합을 배열 로 이동하여 인덱싱 필요성을 줄여 movies
컬렉션 에 속성 패턴 적용 방법을 보여 줍니다.
단계
데이터의 하위 집합을 하나의 배열 로 그룹화합니다.
스키마 재구성하여 다양한 출시하다 날짜 필드를 키-값 쌍의 배열 로 바꿉니다.
db.movies.insertOne( { "_id": 1, "title": "Star Wars", "runtime": 121, "directors": ["George Lucas"], releases: [ { location: "USA", date: ISODate("1977-05-20T01:00:00+01:00") }, { location: "France", date: ISODate("1977-10-19T01:00:00+01:00") }, { location: "Italy", date: ISODate("1977-10-20T01:00:00+01:00") }, { location: "UK", date: ISODate("1977-12-27T01:00:00+01:00") } ] } )
결과
문서 에 동일하거나 유사한 특성을 추적 하는 필드가 여러 개 있는 경우 속성 패턴 유사한 각 필드 에 인덱스를 만들 필요가 없습니다. 유사한 필드를 배열 로 통합하고 해당 배열 에 인덱스 생성하면 필요한 총 인덱스 수를 줄이고 쿼리 성능을 향상시킬 수 있습니다.
기타 사용 사례
속성 패턴 문서 항목의 특성을 설명할 때 유용할 수 있습니다. 의류와 같은 일부 제품의 사이즈는 스몰, 미디엄, 라지 등으로 표시될 수 있습니다. 동일한 컬렉션 에 있는 다른 제품은 볼륨으로 표현될 수 있는 반면, 다른 제품은 물리적 크기나 무게로 표현될 수 있습니다.
예시 를 들어, 물병 컬렉션 가정해 보겠습니다. 속성 패턴 사용하지 않는 문서 다음과 같습니다.
db.bottles.insertOne([ { "_id": 1, "volume_ml": 500, "volume_ounces": 12 } ])
다음 코드는 bottles
컬렉션 에 속성 패턴 적용합니다.
db.bottles.insertOne([ { "_id": 1, specs: [ { k: "volume", v: "500", u: "ml" }, { k: "volume", v: "12", u: "ounces" }, ] } ])
첫 번째 문서 의 volume_ml
및 volume_ounces
필드에 유사한 정보가 포함되어 있으므로 위의 스키마 이를 하나의 필드specs
로 통합합니다. specs
필드 지정된 물병의 측정 사양에 관한 정보를 그룹화하며, 여기서 k
필드 측정 대상을 지정하고, v
값을 지정하며, u
측정 단위를 지정합니다.
속성 패턴 사용하면 이름이 다른 유사한 필드를 함께 그룹 할 수도 있습니다. 측정 대상을 지정하는 k
필드 와 같이 키-값 쌍을 통해 속성을 지정하면 다양한 유사한 필드를 하나의 배열 에 저장 수 있으므로 데이터를 효율적으로 쿼리 데 필요한 인덱스 수를 최소화할 수 있습니다.
예시 를 들어 bottles
컬렉션 에 있는 이 문서 속성 패턴 사용하지 않는다고 가정해 보겠습니다. 이 문서 물병의 볼륨 및 높이에 대한 사양이 저장되어 있습니다.
db.bottles.insertOne([ { "_id": 1, "volume_ml": 500, "volume_ounces": 12, "height_inches": 8 } ])
다음 코드는 속성 패턴 문서 에 적용합니다. volume_ml
, volume_ounces
및 height_inches
필드를 모두 specs
배열 로 그룹화합니다.
db.bottles.insertOne([ { "_id": 1, specs: [ { k: "volume", v: "500", u: "ml" }, { k: "volume", v: "12", u: "ounces" }, { k: "height", v: "8", u: "inches" } ] } ])
k
, v
, u
등의 키-값 쌍을 사용하면 배열 에 추가할 수 있는 필드를 더 유연하게 선택할 수 있습니다. 배열 로 통합할 수 있는 필드가 많을수록 생성해야 하는 인덱스가 줄어들어 쿼리 성능이 극대화됩니다.