Firestore中用户疫苗接种状态应存用户集合还是新建独立集合?
Firestore 疫苗接种数据存储方案分析
方案1:接种数据嵌入用户集合存储
就是把接种状态、剂次、疫苗类型等信息作为字段直接写在对应用户的文档中,优劣势如下:
- 优势
- 管理员扫码查询用户信息时仅需1次查询即可拿到完整的用户基础信息+接种数据,响应速度快
- 无需维护多集合关联,初期开发成本更低
- 劣势
- 后续做月度分疫苗类型的统计时,必须遍历全量用户集合查询匹配数据,用户量上涨后查询成本(Firestore按读取次数计费)会非常高,查询速度也会大幅下降
- 若后续需要拓展每剂次的接种时间、接种点、批号等详细信息,用户文档会持续臃肿,甚至触及单文档1MB的大小上限
- 权限隔离困难,若后续要给接种人员开放接种数据录入权限,必须同时开放用户集合的读写权限,用户隐私数据泄露风险更高
方案2:新建独立vaccination_records集合存储
单独建集合存所有用户的接种数据,每条记录通过user_id字段关联对应用户,优劣势如下:
- 优势
- 统计效率极高,可针对
vaccine_type、doses_count、vaccinated_at等字段提前建复合索引,月度统计时直接按条件过滤即可拿到结果,无需遍历全量用户,查询速度稳定、读取成本极低 - 拓展性强,后续要增加接种记录补登、异常记录、多剂次明细等内容时,直接在该集合拓展字段即可,完全不影响用户集合的结构
- 权限控制灵活,可单独给接种工作人员分配接种集合的读写权限,无需开放用户核心信息,数据安全性更高
- 统计效率极高,可针对
- 劣势
- 管理员扫码查询用户信息时需要多1次关联查询,查询性能损耗极低,基本不会影响使用体验
- 需要额外维护集合关联逻辑,初期开发工作量略有增加
最终推荐
优先选择独立集合存储接种记录的方案,完全匹配你后续的统计需求,长期来看可维护性、成本控制、安全性都远优于嵌入用户集合的方案。
小建议:你可以直接把接种记录的文档ID设置为对应用户的ID,后续查询用户接种数据时可以直接用用户ID精准获取,不需要额外过滤查询,效率更高。统计用的核心字段提前建好复合索引,后续生成月度图表可以做到秒级响应。
内容的提问来源于stack exchange,提问作者JS3
相关产品推荐
相关产品推荐

