첫 번째 솔루션은 두 번째 솔루션에 비해 깨끗한 제품 컬렉션을 가지고 있으며, 제품 컬렉션의 모든 문서는 shop_id 필드 (내 생각에 낭비되는 공간)가 있지만 첫 번째 구조를 통해 모든 제품을 얻는 것은 고통 스러울 수 있지만 두 번째 솔루션은 매우 쉽습니다.
그래서 어느 것이 최고인지 궁금합니다. 아니면 더 나은 솔루션이 있습니까?
답변1
다음 질문을 스스로에게 물어보십시오. 동일한 제품을 여러 상점에서 판매 할 수 있어야합니까?
대답이 '아니요'인 경우 shop_id 는 Shop의 속성이며 두 번째 옵션이 유효한 솔루션이어야한다고 생각할 수 있습니다.
대답이 '예'이면 제품을 여러 상점에 매핑 할 수 있어야합니다. 두 번째 디자인을 사용하려면 제품 객체를 여러 번 복제해야합니다 (판매 점당 한 번). 이는 ProductInShop 을 호출 할 수있는 새 스키마와 동일합니다.
이를 모델링하는 방법에는 여전히 두 가지 매우 유효한 옵션이 있습니다. 1) ShopSchema 에 product_ids 속성을 추가하거나 2) ProductSchema 에 shop_ids 속성을 추가합니다.
공간을 절약하면 데이터를 정규화하는 것도 의미한다고 생각합니다. 관계형 데이터베이스와 달리 문서 데이터베이스에서는 일반적으로 정규화를 피하고 대신 가능한 한 많이 비정규 화하는 경향이 있습니다. 예를 들어, 관계형 데이터베이스에서는 일반적으로 shop_id 및 product_id 열이있는 새 테이블로이를 추가합니다. MongoDB와 같은 문서 데이터베이스에서는 일반적으로 "문서 결합"을 피하기 위해 단일 문서에 가능한 한 많이 포함하는 것을 선호해야합니다.
또한 몽구스에 대한 참고 사항입니다. Mongoose의 채우기 를 이용하려면 컬렉션 이름에 대한 명시적인 참조를 추가로 제공하세요. 예를 들면 :
두 번째 버전은 대부분의 사용 사례에서 훨씬 더 효율적입니다. 비정규 화는 NoSQL 지속성 솔루션을 사용하는 게임의 이름입니다. 목표는 가능한 적은 쿼리로 필요한 데이터를 최대한 많이 확보하는 것입니다. 이를 위해서는 데이터를 복제해야하며 중복 된 데이터가 변경 될 때 많은 수의 문서를 업데이트해야하는 잠재적 인 골칫거리를 처리해야합니다.
예를 들어 웹페이지에 해당 정보를 표시하려는 경우 제품 문서에 상점 이름을 추가해야 할 수도 있습니다. 그렇지 않은 경우 상점 컬렉션을 쿼리해야하기 때문입니다. 상점 이름이 변경되는 경향이 없다는 사실을 감안할 때 상대적으로 두통이 없어야하지만 스키마를 설계 할 때 고려해야 할 사항입니다. 사용 사례부터 시작하여 설계 할 때 아래로 내려가십시오.