Firebase数据库结构 [英] Firebase database strucutre
问题描述
我目前正在为iOS创建一个电子商务应用程序,而且我很难决定如何构建用户通过关键字搜索项目的情况下的数据库。我不知道是否最好是存储一个关键字数组或只是关键字的字符串。
如果你们有任何建议,请告诉我!
谢谢。
下面是我现在为单个项目准备的结构:
items:{
item1_id:{
brand_id:brandName_id,
itemName:.....,
price:.....,
关键字:?
$ / code $ / pre
解决方案 Firebase,您可以使用单个值或值范围进行查询,因此构建单个查询以获取匹配多个关键字的项目是不可能的。但是,您可以安排您的数据库,以便您可以轻松查询或单个关键字。您可能需要合并几个查询等。
您可以像这样安排您的数据:
item:{
item1_id:{
brand_id:...,
itemName: 。
price:...,
关键字:{
black:true,
t-shirt:true
}
$ p $但是,正如这个答案,你需要为每个关键字定义一个索引。为了实现高效的基于关键字的查询,您可以创建自己的关键字到项目的映射:
{
项目:{
item1_id:{
brand_id:...,
itemName:...,
price:...,
关键字:{
black:true,
t-shirt:true
}
}
},
关键字:{
black:{
item1_id:true
},
t-shirt:{
item1_id:true
$ b 关键字的查询可能是像这样:
let keyword =black;
database.ref(`keywords / $ {keyword}`).once(value,(snapshot)=> {
snapshot.forEach((idSnapshot)=> {
数据库.ref(`items / $ {idSnapshot.key}`).once(value,(itemSnapshot)=> {
console.log(JSON.stringify(itemSnapshot.val()));
});
});
});
必须维护您自己的关键字到项目的映射会有点痛苦,但查询会很快。此外,Firebase的多位置更新可以使维护关键字映射更容易一些。要创建一个项目:
database.ref()。update({
items / item1_id:{
brand_id:...,
itemName:...,
price:...,
关键字:{
black :true,
t-shirt:true
}
},
keywords / black / item1_id:true,
keywords / t-shirt / item1_id:true
});
要更改项目的关键字(删除黑色
,添加蓝色
并且保留 t-shirt
不变):
< (
items / item1_id / keywords:{
black:null,
blue)$ {$ b $ p> database.ref :true
},
keywords / black / item1_id:null,
keywords / blue / item1_id:true
});
删除一个项目:
<$ p (
items / item1_id:null,
keywords / blue / item1_id:null,
关键字/ t-shirt / item1_id:null
});
I'm currently creating an e-commerce app for iOS and I'm having trouble deciding on how to structure my database for the scenario of a user searching for an item by "keywords". I wasn't sure if it would be better to store an array of the keywords or just having a string of key words for that item.
If you guys have any suggestions please let me know!
Thank you.
Here's the structure I have for a single item right now:
"items": {
"item1_id":{
"brand_id": brandName_id,
"itemName":.....,
"price":.....,
"keywords": ?
}
}
In Firebase, you can query using a single value or a value range, so constructing a single query to obtain items matching several keywords is not going to be possible. However, you could arrange your database so that you could easily query or a single keyword. You'd then need to combine several queries, etc.
You could arrange your data like this:
{
"items": {
"item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
}
}
}
However, as explained in this answer, you would need to define an index for each keyword. To allow for efficient keyword-based queries, you could create your own mapping of keywords to items:
{
"items": {
"item1_id": {
"brand_id": ...,
"itemName": ...,
"price": ...,
"keywords": {
"black": true,
"t-shirt": true
}
}
},
"keywords": {
"black": {
"item1_id": true
},
"t-shirt": {
"item1_id": true
}
}
}
The query for a keyword would be something like this:
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()));
});
});
});
Having to maintain your own mapping of keywords to items is a little painful, but the queries will be fast. Also, Firebase's multi-location updates can make maintaining the keywords mapping a little easier. To create an item:
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
});
To change an item's keywords (remove black
, add blue
and leave t-shirt
untouched):
database.ref().update({
"items/item1_id/keywords": {
"black": null,
"blue": true
},
"keywords/black/item1_id": null,
"keywords/blue/item1_id": true
});
And to delete an item:
database.ref().update({
"items/item1_id": null,
"keywords/blue/item1_id": null,
"keywords/t-shirt/item1_id": null
});
这篇关于Firebase数据库结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!