2016-12-15 1 views
1

현재 iOS 용 전자 상거래 앱을 만들고 있는데 "키워드"로 항목을 검색하는 사용자의 시나리오에 대해 데이터베이스를 구조화하는 방법을 결정하는 데 문제가 있습니다. 키워드의 배열을 저장하거나 해당 항목에 대한 핵심 단어 문자열을 갖는 것이 더 나은지 확실하지 않았습니다.Firebase 데이터베이스 strucutre

혹시 의견이 있으시면 알려주세요.

감사합니다. 여기

지금은 하나의 항목에 대해 내가 가지고있는 구조입니다 :

"items": { 
     "item1_id":{ 
      "brand_id": brandName_id, 
      "itemName":....., 
      "price":....., 
      "keywords": ? 
    } 
    } 
+1

당신은 키워드 기반 쿼리를 가지고 하시겠습니까 설계 옵션과 함께 검은 모자의 모든 원한다면? – cartant

+0

예! 사람이 .... "검은 색, 티셔츠, 디자인 .. 등의 항목을 기반으로 검색하려고한다면"@cartant –

답변

2

는 중포 기지에서 그렇게 여러 키워드입니다 일치하는 항목을 얻을 수있는 하나의 쿼리를 작성, 단일 값 또는 값 범위를 사용하여 조회 할 수 있습니다 가능하지 않을거야. 그러나 쉽게 쿼리하거나 단일 키워드를 사용할 수 있도록 데이터베이스를 정렬 할 수 있습니다. 그런 다음 당신은 이런 식으로 데이터를 정렬 할 수 등

, 여러 쿼리를 결합해야 것 : this answer에 설명 된대로

{ 
    "items": { 
    "item1_id": { 
     "brand_id": ..., 
     "itemName": ..., 
     "price": ..., 
     "keywords": { 
     "black": true, 
     "t-shirt": true 
     } 
    } 
    } 
} 

그러나, 각 키워드에 대한 인덱스를 정의해야합니다. 효율적인 키워드 기반 쿼리를 허용하려면 항목에 키워드의 자신의지도를 만들 수 있습니다 자신을 유지하는 데

let keyword = "black"; 
database.ref(`keywords/${keyword}`).once("value", (snapshot) => { 
    snapshot.forEach((idSnapshot) => { 
    database.ref(`items/${idSnapshot.key}`).once("value", (itemSnapshot) => { 
     console.log(JSON.stringify(itemSnapshot.val())); 
    }); 
    }); 
}); 

:

{ 
    "items": { 
    "item1_id": { 
     "brand_id": ..., 
     "itemName": ..., 
     "price": ..., 
     "keywords": { 
     "black": true, 
     "t-shirt": true 
     } 
    } 
    }, 
    "keywords": { 
    "black": { 
     "item1_id": true 
    }, 
    "t-shirt": { 
     "item1_id": true 
    } 
    } 
} 

키워드에 대한 쿼리는이 같은 것 항목에 키워드를 매핑하는 것은 다소 힘들지만 쿼리가 빠를 것입니다. 또한 Firebase의 다중 위치 업데이트를 통해 키워드 매핑을 좀 더 쉽게 유지 관리 할 수 ​​있습니다. 항목의 키워드 (black을 제거 blue를 추가하고 그대로 t-shirt를 떠나) 변경하려면

database.ref().update({ 
    "items/item1_id": { 
    "brand_id": ..., 
    "itemName": ..., 
    "price": ..., 
    "keywords": { 
     "black": true, 
     "t-shirt": true 
    } 
    }, 
    "keywords/black/item1_id": true, 
    "keywords/t-shirt/item1_id": true 
}); 

: 항목을 만들려면

database.ref().update({ 
    "items/item1_id/keywords": { 
    "black": null, 
    "blue": true 
    }, 
    "keywords/black/item1_id": null, 
    "keywords/blue/item1_id": true 
}); 

을 그리고 항목 삭제 :

database.ref().update({ 
    "items/item1_id": null, 
    "keywords/blue/item1_id": null, 
    "keywords/t-shirt/item1_id": null 
}); 
+0

이 시나리오에서 각 카테고리에 대한 인덱스를 정의해야합니다. 대안은'/ categories/$ category/item1 : true'를 모델링하는 것입니다. http://stackoverflow.com/questions/40656589/를 참조하십시오. firebase-query-if-child-of-a-value –

+0

Thanks, @FrankvanPuffelen. 답을 다시 썼습니다. – cartant

+0

고마워요. Cartant와 @Frank van Puffelen 저는 이것을 iOS 앱. 일단 내가 업데이트하면 알려 드리겠습니다. –

2

어떻게 약 :

items 
     item0 
     color: black 
     type: t-shirt 
     option: design 
     keywords: black_t-shirt_design 
     item1 
     color: black 
     type: hat 
     option: design 
     keywords: black_hat_design 

다음에 startingAt 및 endingAt를 사용하는 간단한 쿼리입니다. 마찬가지로

itemsRef.queryOrdered(byChild: "keywords") 
     .queryStarting(atValue: "black_hat") 
     .queryEnding(atValue: "black_hat") 

는 IF : 그래서 예를 들어

는 사용자가 결과를 좁힐 수있는 필터를 사용하고 검은 모자의 모든 약을 알고 싶어하고 옵션 매개 변수가 무엇인지 상관하지 않는다라고 사용자는 검은 색 의류에 대해 알고 싶었지만 '색상'아동을 검정색으로 쿼리 할 수있었습니다.

하지만 그들은

itemsRef.queryOrdered(byChild: "keywords") 
     .queryStarting(atValue: "black_hat_design") 
     .queryEnding(atValue: "black_hat_design")