我目前正在为iOS创建一个电子商务应用,我无法决定如何根据用户搜索项目的方案来构建数据库" keywords&#34 ;。我不确定是否更好地存储关键字数组或只是为该项目提供一串关键字。
如果您有任何建议,请告诉我们!
谢谢。
这是我现在对单个项目的结构:
"items": {
"item1_id":{
"brand_id": brandName_id,
"itemName":.....,
"price":.....,
"keywords": ?
}
}
答案 0 :(得分:2)
在Firebase中,您可以使用单个值或值范围进行查询,因此构建单个查询以获取与多个关键字匹配的项目是不可能的。但是,您可以安排数据库,以便轻松查询或单个关键字。然后,您需要结合多个查询等。
您可以像这样安排数据:
{
"items": {
"item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
}
}
}
但是,正如this answer中所述,您需要为每个关键字定义一个索引。为了实现高效的基于关键字的查询,您可以创建自己的关键字到项目的映射:
{
"items": {
"item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
}
},
"keywords": {
"black": {
"item1_id": true
},
"t-shirt": {
"item1_id": 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()));
});
});
});
必须维护自己的关键字到项目的映射有点痛苦,但查询会很快。此外,Firebase的多位置更新可以使关键字映射维护更容易一些。要创建项目:
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
});
更改项目的关键字(移除black
,添加blue
并保持t-shirt
不变):
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
});
答案 1 :(得分: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")