2016-12-15 7 views
1

現在、iOS用の電子商取引アプリケーションを作成しており、「キーワード」で項目を検索しているユーザーのシナリオでデータベースを構築する方法を決定するのに問題があります。私は、キーワードの配列を格納するか、単にその項目のキーワードの文字列を持つ方が良いかどうかはわかりませんでした。Firebaseデータベースの構築が完了しました

皆さんにご意見がありましたらお知らせください。

ありがとうございます。ここで

は、私が今、単一のアイテムを持っている構造です:Firebaseで

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

と黒の帽子のすべてを望んでいた場合は、キーワードベースのクエリを持っているつもりですか? – cartant

+0

はい私はそうです!人が.... "黒、Tシャツ、デザインなどのようなものに基づいて商品を検索したい場合"@cartant –

答えて

2

、あなたはとてもいくつかのキーワードに合致するアイテムを得るために、単一のクエリをされ構築、単一の値または値の範囲を使用して照会することができます可能ではないだろう。ただし、簡単にクエリを実行できるように、または単一のキーワードをデータベースに配置することもできます。あなた、あなたはこのようなあなたのデータを配置でき

など、いくつかのクエリを結合する必要があるだろう:

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

しかし、this answerで説明したように、あなたは、各キーワードのインデックスを定義する必要があります。効率的なキーワードベースのクエリを可能にするには、アイテムにキーワードの独自のマッピングを作成することができます。あなた自身を維持する必要が

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

ありがとう、@FrankvanPuffelen答えを書き直しました – cartant

+0

おかげでカートゥントと@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") 

場合ユーザーは衣服のすべてが黒であることを知りたがっていましたが、「色」の子供を黒で検索することができました。

しかし、彼らは設計オプション

itemsRef.queryOrdered(byChild: "keywords") 
     .queryStarting(atValue: "black_hat_design") 
     .queryEnding(atValue: "black_hat_design") 
関連する問題