Firebase实时数据库查询数据

5

我希望存储一些儿童活动的数据,其中每个活动适合特定年龄段。比如说活动A适合2-5岁的儿童,活动B适合0-1岁的儿童。

客户端有一组固定的选择项,如下所示: 0-1岁, 1-3岁, 4-5岁, 6-13岁

现在的要求是,活动A应该出现在选择1-3岁和4-5岁时,因为2-5岁重叠了这两个范围。

那么,什么是存储活动数据并高效查询的好方法呢?

2个回答

4
假设你的应用程序中的一组固定选项不会改变,我建议为每个匹配项添加一个布尔字段。例如,你的活动可能如下所示:
activities: {
  activityA: {
    range0to1: false,
    range2to3: true,
    range4to5: true,
    range6to13: false
  },
  activityB: {
    range0to1: true,
    range2to3: false,
    range4to5: false,
    range6to13: false
  }
}

当您想查询适用于2至3岁年龄段的所有活动时,您已经有了可查询的字段,无需过于复杂。

但实际上,为了长期考虑,我不会假设固定的选择集对应用程序的整个生命周期都是永久的,因此我更喜欢这样的东西:

activities: {
  activityA: {
    minAge: 2,
    maxAge: 5,
  },
  activityB: {
    minAge: 0,
    maxAge: 1,
  }
}

如果我想查询年龄在x和y之间的固定选择,我的理想查询将是针对所有minAge或maxAge在x和y之间(因此范围有重叠)的所有活动。

例如(伪代码)where ((minAge > x and minAge < y) or (maxAge > x or maxAge < y))

但不幸的是,在实践中,Firebase RTDB不允许您按多个字段查询,因此如果还没有太迟,我建议查看Firestore,它可能更适合您的需求(就个人而言,我通常会为大多数用例推荐Firestore而不是RTDB)。

如果您被困在RTDB中,则另一个解决方案可能是在结构的根处创建查找块:

{
  activities: {
    activityA: {
      // age range of 2-5 stored however you like
    },
    activityB: {
      // age range of 0-1 stored however you like
    },
    activityC: {
      // age range of 0-3 stored however you like
    }
  },
  ageActivityLookup: {
    age0: {
      activityB: true,
      activityC: true,
    },
    age1: {
      activityB: true,
      activityC: true,
    },
    age2: {
      activityA: true,
      activityC: true,
    },
    age3: {
      activityA: true,
      activityC: true,
    },
    age4: {
      activityA: true,
    },
    age5: {
      activityA: true,
    }
  }
}

那么,您可以简单地查询ageX并获取活动列表。如果您正在寻找一定范围内的年龄,则这将意味着多个查询,并且需要确保您的查找块保持同步。如果应用程序的数据结构不太复杂,那么这应该是可以接受的。

这个解决方案的问题在于组合太多了,因为我们可能有数百个活动。然后在客户端执行唯一操作以删除重复匹配。询问范围将需要多个查询,正如您已经提到的那样。 - Moblize IT
实际上这也是我从Firebase转换到Firestore的原因之一。我相信考虑到这些限制,我的答案是最佳可用解决方案。 - Hussein Duvigneau

0

@hussein,受到您的启发,我对它进行了简化以适应我的用例。而且,我并没有使用单独的节点,而是在活动中添加了每个年龄组的分类,例如:

婴儿:真 青少年:真

等等。

这样可以避免维护和更新整个节点随着活动增长而变得越来越复杂的开销。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接