在Firebase实时数据库中存储数据历史记录的最佳方式是什么?
我正在使用Firebase实时数据库构建一个应用程序。此应用程序的用户将能够创建帖子并随时编辑。此外,他们还可以访问帖子的所有版本,但默认情况下他们会获得最新版本。到目前为止,我已经做到了:在Firebase实时数据库中存储数据历史记录的最佳方式是什么?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在使用Firebase实时数据库构建一个应用程序。此应用程序的用户将能够创建帖子并随时编辑。此外,他们还可以访问帖子的所有版本,但默认情况下他们会获得最新版本。到目前为止,我已经做到了: Realtime Database-root | --- posts | --- postId | --- versionId | |
Realtime Database-root
|
--- posts
|
--- postId
|
--- versionId
| |
| --- uid
| |
| --- title
| |
| --- date
|
--- versionId
|
--- uid
|
--- title
|
--- date
不过,恐怕这是最好的办法。考虑到成本、可扩展性、安全性和性能,这种方法是否可以改进?由于RTDB每GB存储成本为5美元,我建议您使用Google存储作为廉价的数据存储来存储您的版本 这意味着您的数据库应该存储如下帖子:
Realtime Database-root
|
--- posts
|
--- postId
|
--- uid
|
--- title
|
--- date
--- postsVersions
|
--- postId
|
--- version1Id: true
|
--- version2Id: true
version1Id
和version2Id
引用存储在Google存储中的JSON文档
工作流
/posts
中的早期版本
/posts/{postId}
上的onUpdate()
事件中触发的云函数接受以前的版本,并将其作为https://storage.google.com///.json
并将该版本ID保存到/postsVersions
/postsVersions
中删除version1Id
键,则监视/postsVersions/{postId}
上的onDelete()
事件的云函数应该从Google存储中删除该JSON文件
/posts
您应该确保您的版本ID不可用且不连续,然后您可以使用IAM权限为所有经过身份验证的用户提供对bucket的全面访问。对于用户可能无法访问其他用户版本的帖子的更精细的控制,非公共bucket和生成signedURL的API端点将易于实现。如果帖子采用纯文本格式,则只能存储
diff
。平均GNU差异,如有必要,应用补丁为用户显示完整的文本。为清晰起见,实时数据库在付费模式下为5Gb,而免费模式下为1Gb;1Gb是一个很大的职位,即使与旧版本的存储以及。此外,如果您指的是在中存储JSON,那么可能会有问题,因为这通常不是它的目的(尽管可以做到),因为它不可查询/可读,因为RTDB云存储是为需要存储和服务用户生成内容(如照片或视频)的应用程序开发人员构建的JSON。也许这不是问题?我喜欢这个主意,但我也同意@Jay。云存储可能不适合这种情况,因为即使一切正常,这里也存在安全问题。云存储的安全规则仅限于其自身用途。如果没有访问实时数据库的权限,就无法检查用户权限。@Studiegriffin几年来,我一直在运行一个Amazon价格跟踪器,使用GCS以类似的方法存储和检索历史价格数据,从未脱离免费层。这是一个可行的、可扩展的、经济高效的解决方案,如果您想保持低成本,我强烈推荐它。您可以通过使用不可使用的版本名,甚至是提供对象签名URL的简单API终结点来解决安全问题。@Jay“如果您指的是在云存储中存储JSON,这可能会有问题,因为这通常不是它的用途”我不确定您从何处获取JSON,我在一个非常繁忙的网站上做过类似的事情,它的伸缩性非常好。“RTDB无法查询/读取JSON”如果客户想要恢复,他们可以从GCS下载特定版本,然后作为正常更新将JSON推送到RTDB。我并不是说这无法完成,只是官方文档中所述的主要目的更多地是为了blob类型的数据。我是从官方文件中找到的。我只是想弄清楚用例,因为它不能被查询。e、 g.如果您想查询某个特定帖子的“归档”,则此实现不可能实现。然而,如果它是一个恢复,那么肯定-它会工作。只是给一个好的答案多加一点信息。