我正在开发iOS应用。为此,我有一个包含成分和配方的firebase数据库。不难想象;食谱中含有与之相关的儿童成分,并且成分可以包含在多种食谱中。我的JSON结构的一个例子如下:
{
"ingredients" : {
"chicken" : {
"meal1" : true,
"meal2" : true
},
"beef" : {
"meal2" : true
},
"lamb" : {
"meal1" : true,
"meal3" : true
}
},
"meals" : {
"meal1" : {
"ingredients" : {
"chicken" : true,
"lamb" : true
}
},
"meal2" : {
"ingredients" : {
"chicken" : true,
"beef" : true
},
"meal3" : {
"ingredients" : {
"lamb" : true
}
}
}
问题:查询包含用户选择的一组成分并将其添加到配方对象数组的配方列表的最佳做法不带拉入重复食谱?我正在寻找包含至少1种成分匹配的所有食谱。
示例:用户正在从我的示例数据库中搜索包含“ chicken ”和“ beef ”的食谱,我希望返回recipe1和recipe2。食谱2包括鸡肉和牛肉,所以我不希望它被拉入搜索结果两次。
我的第一个想法是查询第一只鸡下的所有餐点,然后查询牛肉下的所有餐点,然后做一些功能来删除重复。在我看来,这不是一个好的解决方案,因为你可以生成多个重复的食物,理论上你必须删除。还有更好的方法吗?
答案 0 :(得分:2)
Firebase本身不提供使用多个查询或链的方法。这可以防止您过度减慢应用程序的速度。 (我们应该为此感到高兴)。
现在有三种不同的方法可以获得理想的结果。
frontend queries:
如果您不希望拥有大量数据,这可能是实现目标的最简单方法。不要害羞地使用它们,它们可以非常高效。
data structure:
第二种方法是重构数据库。相信我,你可以通过这种方式实现所有可以想象的query chain
。
结合使用这两种方法。有时您可以构建一个结构来减少返回值的数量,然后使用前端查询来完成其余的工作。
在你的情况下,你已经拥有了一个非常好的结构。因此,我们假设用户正在搜索lamb
和chicken
您可以调用这些节点并在前端进行某种合并。
但是可能会更快。可能最好的方法是镜像您的数据。您可以创建chicken-lamb
,chicken
,lamb
等节点,然后直接调用它们。当然,这可能会导致大量数据,但速度非常快。
我们假设用户搜索chicken
,beef
和lamb
。您只需创建一个字母数字顺序即可获取节点:/beef-chicken-lamb
。
遵循此方法,您可以避免任何疑问。因此,如果你真的参与表演,这是一个很棒的方式。