我希望存储一些儿童活动的数据,其中每个活动适合特定年龄段。比如说活动A适合2-5岁的儿童,活动B适合0-1岁的儿童。
客户端有一组固定的选择项,如下所示: 0-1岁, 1-3岁, 4-5岁, 6-13岁
现在的要求是,活动A应该出现在选择1-3岁和4-5岁时,因为2-5岁重叠了这两个范围。
那么,什么是存储活动数据并高效查询的好方法呢?
我希望存储一些儿童活动的数据,其中每个活动适合特定年龄段。比如说活动A适合2-5岁的儿童,活动B适合0-1岁的儿童。
客户端有一组固定的选择项,如下所示: 0-1岁, 1-3岁, 4-5岁, 6-13岁
现在的要求是,活动A应该出现在选择1-3岁和4-5岁时,因为2-5岁重叠了这两个范围。
那么,什么是存储活动数据并高效查询的好方法呢?
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,
}
}
}
@hussein,受到您的启发,我对它进行了简化以适应我的用例。而且,我并没有使用单独的节点,而是在活动中添加了每个年龄组的分类,例如:
婴儿:真 青少年:真
等等。
这样可以避免维护和更新整个节点随着活动增长而变得越来越复杂的开销。