잡동사니

반응형

질문

나는 데이터베이스와 같은 상점 & 제품의 두 가지 유형의 구조가 있다고 생각합니다

첫 번째

  ShopSchema = new Schema({
     product_ids:[Schema.Types.ObjectId],
  })

   ProductSchema = new Schema({
     product_name:String,
  })

  ShopSchema = new Schema({

  })

   ProductSchema = new Schema({
     shop_id:Schema.Types.ObjectId,
     product_name:String,
  })

첫 번째 솔루션은 두 번째 솔루션에 비해 깨끗한 제품 컬렉션을 가지고 있으며, 제품 컬렉션의 모든 문서는 shop_id 필드 (내 생각에 낭비되는 공간)가 있지만 첫 번째 구조를 통해 모든 제품을 얻는 것은 고통 스러울 수 있지만 두 번째 솔루션은 매우 쉽습니다.

그래서 어느 것이 최고인지 궁금합니다. 아니면 더 나은 솔루션이 있습니까?


답변1

다음 질문을 스스로에게 물어보십시오. 동일한 제품을 여러 상점에서 판매 할 수 있어야합니까?

대답이 '아니요'인 경우 shop_id 는 Shop의 속성이며 두 번째 옵션이 유효한 솔루션이어야한다고 생각할 수 있습니다.

대답이 '예'이면 제품을 여러 상점에 매핑 할 수 있어야합니다. 두 번째 디자인을 사용하려면 제품 객체를 여러 번 복제해야합니다 (판매 점당 한 번). 이는 ProductInShop 을 호출 할 수있는 새 스키마와 동일합니다.

이를 모델링하는 방법에는 여전히 두 가지 매우 유효한 옵션이 있습니다. 1) ShopSchema product_ids 속성을 추가하거나 2) ProductSchema shop_ids 속성을 추가합니다.

공간을 절약하면 데이터를 정규화하는 것도 의미한다고 생각합니다. 관계형 데이터베이스와 달리 문서 데이터베이스에서는 일반적으로 정규화를 피하고 대신 가능한 한 많이 비정규 화하는 경향이 있습니다. 예를 들어, 관계형 데이터베이스에서는 일반적으로 shop_id product_id 열이있는 새 테이블로이를 추가합니다. MongoDB와 같은 문서 데이터베이스에서는 일반적으로 "문서 결합"을 피하기 위해 단일 문서에 가능한 한 많이 포함하는 것을 선호해야합니다.

또한 몽구스에 대한 참고 사항입니다. Mongoose의 채우기 를 이용하려면 컬렉션 이름에 대한 명시적인 참조를 추가로 제공하세요. 예를 들면 :

var ShopSchema = new Schema({
   product_ids: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
});

이러한 방식으로 몽구스를 사용하여 예를 들어 볼 수 있습니다. "각 상점에서 판매되는 모든 상점 및 모든 제품 찾기":

Shop.find().populate('product_ids').exec(function (err, shops) {
    // ...
});


답변2

두 번째 버전은 대부분의 사용 사례에서 훨씬 더 효율적입니다. 비정규 화는 NoSQL 지속성 솔루션을 사용하는 게임의 이름입니다. 목표는 가능한 적은 쿼리로 필요한 데이터를 최대한 많이 확보하는 것입니다. 이를 위해서는 데이터를 복제해야하며 중복 된 데이터가 변경 될 때 많은 수의 문서를 업데이트해야하는 잠재적 인 골칫거리를 처리해야합니다.

예를 들어 웹페이지에 해당 정보를 표시하려는 경우 제품 문서에 상점 이름을 추가해야 할 수도 있습니다. 그렇지 않은 경우 상점 컬렉션을 쿼리해야하기 때문입니다. 상점 이름이 변경되는 경향이 없다는 사실을 감안할 때 상대적으로 두통이 없어야하지만 스키마를 설계 할 때 고려해야 할 사항입니다. 사용 사례부터 시작하여 설계 할 때 아래로 내려가십시오.



 

 

 

 

출처 : https://stackoverflow.com/questions/12930610/what-is-the-best-structure-of-a-shop-product-like-database-in-mongodb

반응형

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band