如何在Firebase Firestore中最优存储与查询日历重复事件模式
Firestore存储日历重复事件的方案参考
受Firebase Firestore本身能力限制,无法采用SQL场景下常用的存储时间区间、查询时间区间的实现方法。针对「如何在Firebase Firestore中存储日历重复模式,实现查询特定日期时可返回所有重复规则覆盖该日期的事件,同时兼容无结束日期的场景」的需求,可参考以下四类实现方案:
- 写密集方案:存储重复日期 - 将所有可能的重复日期存储在事件文档的数组中。针对无结束日期的场景,仅存储自然年内的日期,当用户查询次年及之后的日期时,再拉取所有无结束日期的事件,写入对应年份的所有重复日期。该方案可用性较高,因为用户极少查询超出当前自然年的日期,即便有查询需求,每个新查询年份也仅需执行一次写入操作。
- 读密集方案:查询所有重复结束日期>=查询日期的事件 - 这是一种兜底方案,依赖客户端应用完成筛选,仅展示匹配查询日期的事件。该方案实现更简单,但读取开销远高于写密集方案。例如:如果存在1000个无结束日期的重复事件,每次页面导航都会产生1000次文档读取,远高于前一种方案仅在用户跨年度查询时才读写1000个事件的开销。
- 同步离线中间SQLite数据存储 - 该方案实现过重,但支持SQL查询,不过会引入大量本地与Firebase之间写操作同步的问题。
- 利用Firestore默认的offline data persistence特性 - 通过监听器实时查询所有用户事件,当有事件更新或新增时同步更新缓存,该查询为全应用级,后续所有查询都直接调用缓存数据。该方案可最大限度减少实际数据库的读取次数,依托缓存数据和客户端计算能力对事件进行筛选。
从落地成本和需求匹配度来看,短期可优先采用写密集方案,长期如果有用户离线管理事件的需求,可考虑切换为同步离线中间SQLite数据存储的方案。
内容的提问来源于stack exchange,提问作者lhengl
相关产品推荐
相关产品推荐

