我读过这article,如果您发现我的任何解释晦涩难懂,请参考它.基本上,其 idea 是,每当您添加或编辑文档时,您都会 for each 文档分配一个last_modified字段,这些文档将根据其访问或修改的日期更新.每当查询Firerestore数据库时,用户设备上的日期都会保存为lastQueried.您在Firerestore数据库中查询last_modifiedlastQueried的文档,并且应该只返回已添加或修改的文档.查询的结果存储在用户的本地数据库中.

现在来谈谈手头的问题.假设您从Firerestore数据库中删除了文档.用户的本地数据库将无法检测到该删除,除非它读取整个Firestore集合.

我想出的解决方案是向文档添加一个deleted或更专业的archived布尔字段,这将使我能够从本地数据库中删除任何具有archived: true的文档.这不是一个最佳解决方案;然而,因为虽然它保持了"降低阅读成本"的主题,但文档仍然会保留在数据库中,这对于需要大量删除的数据库来说并不好.

我不是数据库方面的专家,但我认为这个数据库设计是一个标准.那么,你会如何解决这个问题呢?我的初始设计是否有缺陷或不适合我的用例?

如有任何帮助,我们将不胜感激.

推荐答案

你会如何解决这个问题?

您实际上没有所提供的解决方案的替代方案. 为了实施此方案,您必须接受"删除"文档并将该事件传播到客户端的唯一方法,您必须使用字段来识别为"已删除",而不是实际删除它.

如果您不想永远接受数据库中的这些"墓碑"文档,那么您就需要弄清楚何时真正删除它们,以及如何通知所有相关客户端应用程序发生了这种情况. 否则,客户端可能会变得不同步,认为存在文档,而实际上根本不存在.

我们无法告诉您删除这些墓碑文件的频率. 这取决于您愿意接受多少成本和错误.

如果您 Select 删除墓碑文档,则让客户端恢复与数据库同步的唯一100%准确方法是让客户端定期查询整个集合并协调结果中任何缺失的文档. 您必须承认,在此同步发生之前,客户端可能不知道一些最近删除的文档. 至少,客户端需要一个未删除的文档ID列表.

再次:much of this is entirely up to you to decide how much error and cost you are willing to accept, and we can't tell you what exactly you should do.

Database相关问答推荐

为Postgres数据库字段创建复合索引

华为Appcube中的对象字段类型

如何将 Scylla DB 中的计数器列重置为零?

数据库是序列图中的控制器还是边界?

文件存储的推荐位置 - 在数据库或其他什么地方?

优雅地处理 EJB/JPA 环境中的约束冲突?

我们如何使用 Hibernate 和 JPA 调用存储过程?

Objective-C中是否有类似于LINQ的东西?

为什么null不等于null false

当使用多个 WHEN MATCHED 语句时,它们是全部执行,还是只执行一个?

在迁移中添加行

NoSql DB 和 OO Db 有什么区别?

如何在数据库中搜索和替换字符串的所有实例?

如何使用 Hibernate 在不丢失数据的情况下更新数据库模式?

处理多个表的最佳实践

何时在关系数据库中使用枚举或小表?

为什么 DBMS 不支持 ASSERTION

多币种 - 存储什么以及何时转换?

每个开发人员一个数据库?

如何知道mongodb使用的是哪个存储引擎?