Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Firebase实时数据库中存储数据历史记录的最佳方式是什么?_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

在Firebase实时数据库中存储数据历史记录的最佳方式是什么?

在Firebase实时数据库中存储数据历史记录的最佳方式是什么?,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在使用Firebase实时数据库构建一个应用程序。此应用程序的用户将能够创建帖子并随时编辑。此外,他们还可以访问帖子的所有版本,但默认情况下他们会获得最新版本。到目前为止,我已经做到了: Realtime Database-root | --- posts | --- postId | --- versionId | |

我正在使用Firebase实时数据库构建一个应用程序。此应用程序的用户将能够创建帖子并随时编辑。此外,他们还可以访问帖子的所有版本,但默认情况下他们会获得最新版本。到目前为止,我已经做到了:

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文档

工作流

  • 用户创建初始post并创建数据库条目

  • 用户进行更改并将其保存到RTDB,覆盖
    /posts
    中的早期版本

  • /posts/{postId}
    上的
    onUpdate()
    事件中触发的云函数接受以前的版本,并将其作为
    https://storage.google.com///.json
    并将该版本ID保存到
    /postsVersions

  • 如果用户从该
    /postsVersions
    中删除
    version1Id
    键,则监视
    /postsVersions/{postId}
    上的
    onDelete()
    事件的云函数应该从Google存储中删除该JSON文件

  • 最后,如果用户希望加载以前版本的帖子,他们会发出一个简单的HTTPS请求,从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.如果您想查询某个特定帖子的“归档”,则此实现不可能实现。然而,如果它是一个恢复,那么肯定-它会工作。只是给一个好的答案多加一点信息。