我希望存储一些儿童活动的数据,其中每个活动都适合特定的年龄范围。比方说A幕适合2-5岁的孩子。B幕适合0 -1岁的儿童。
在客户端,有一组固定的选择,比如:0-1年,1-3年,4-5年,6-13年
现在的要求是活动A应该出现在选择1-3以及4-5年,因为2 -5重叠这两个范围。
存储活动数据并有效地查询它的好方法是什么?
发布于 2020-10-26 23:00:47
@侯赛因作为你的想法的灵感来源,我对它进行了一些简化,以适应我的用例。实际上,我在活动中添加了每个年龄组的分类,而不是单独的节点,如下所示:
婴儿:真实的青少年:真实的
诸若此类。
这节省了维护和更新整个节点的开销,并且随着活动的增加而增加了复杂性
发布于 2020-10-19 07:53:28
假设固定的选择集是您的应用程序的永久特性,我将为每个匹配设置一个布尔值字段,例如,您的活动将如下所示:
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之间的所有活动(因此在范围内有重叠)。
eg (伪代码) 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并获得活动列表。如果你正在寻找一个年龄范围,这将意味着多个查询,并且确实意味着必须确保你的查找块保持同步。如果您的应用程序数据结构的其余部分不太复杂,这应该是可以的。
https://stackoverflow.com/questions/64312088
复制相似问题