使用Firestore对软删除数据进行建模

3
我正在尝试实现软删除,通过在每个文档上添加一个名为deletedOn的字段来实现,它是一个时间戳或null。但到目前为止,这给我的查询带来了一些麻烦,因为我需要在每个查询中过滤掉这些文档。在UI中暴露了deletedOn用于永久删除,但如果客户联系支持部门,我们可以通过将deletedOn字段设置为null来“恢复”被“删除”的数据。在NoSQL数据库中还有更好的建模方式吗?我倾向于使用不同的集合,例如contactscontacts_deleted,当一个contact被删除时,将其移动到相应的另一个集合中。但我是新手,所以不知道哪种方式会更好。

你尝试过实现它吗?你的想法有什么问题吗? - Alex Mamo
2个回答

6

我最终创建了两个不同的集合来存储未删除和已删除的文档,例如 contactscontacts_deleted,然后创建了一个Firebase函数来监视在 contacts 集合中的删除操作,并将文档复制到 contacts_deleted 集合中。这样,将已删除的文档移动的责任不会落在客户端身上。


1
你做得很好,Kdawgwilk。 - maletor

0

另一个选择是在每个文档中存储一个“状态”字段。然后,您可以在数据库安全规则中要求此状态:

match /posts/{post} {
    allow read: if true

    allow create:
        if request.resource.data.keys().hasAll(['name','status','created', 'modified'])
}

只有在您以后想要删除它们时,创建和修改才很重要,这是您使用firebase.database.ServerValue.TIMESTAMP设置的。

例如,您可以将每个文档设置为“已发布”状态,然后当您将其移到垃圾箱时,将其更改为“已删除”。然后,您可以通过以下方式查询并仅获取“已发布”的帖子:

db.collection('posts').where('status', '==', 'published');

可选项

然后(可选地),如果您想编写定时函数,则可以永久删除所有垃圾邮件,前提是它们比特定时间戳旧30天以上。

var now = Date.now(); var cutoff = now - 30 * 24 * 60 * 60 * 1000; // 30 天
db.collection('posts').where('status', '==', 'trashed').where('modified', '<' cutoff);

尽管从定价方面来看,最好将数据保留下来,以免产生额外的读/写成本,因为存储相当便宜($0.18/GiB),不会影响性能,并且读/写相对昂贵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接