【问题标题】:Should I have multiple documents in a collection or have multiple objects/array elements in a document?我应该在一个集合中有多个文档还是在一个文档中有多个对象/数组元素?
【发布时间】:2021-11-16 15:32:47
【问题描述】:

我正在尝试在 firebase 中创建一个项目,其中我有一个集合供用户使用。管理员必须对这些用户进行多项操作,简而言之,需要在屏幕上显示所有这些操作。我目前在我的“用户”集合中为每个用户提供 1 个文档。一切正常,但由于管理员似乎每天要多次获取所有记录,我的 Firestore 读取超出了免费套餐。

现在解决这个问题的合乎逻辑的解决方案似乎是将所有用户放在一个名为 users 的文档中。我可以使用 userIds 作为键或将它们存储在数组中以便于查询。但有件事告诉我,出于安全考虑,这毕竟不是一个好主意,因为在这种情况下,我的所有数据都会暴露给非管理员用户。

这个问题的中间解决方案是什么?

【问题讨论】:

    标签: firebase google-cloud-platform google-cloud-firestore


    【解决方案1】:

    现在解决这个问题的合乎逻辑的解决方案似乎是将所有用户放在一个名为 users 的文档中。

    这当然是一个可以继续使用的解决方案。但这并不意味着您将不得不放弃将用户存储在集合中。您应该将所有用户存储在一个集合以及一个文档/文档中。这种类型的操作称为非规范化,它是 NoSQL 数据库的常见做法。有关更多信息,我建议您阅读以下帖子中的答案:

    话虽如此,您可以使集合中的用户与文档中的用户对象保持同步。

    由于管理员似乎每天要多次获取所有记录,因此我的 Firestore 读取超出了免费套餐。

    既然您在谈论阅读,那么您的管理员应该始终阅读文档/文档中的数据,并且不要在每次他们只想读取一些用户数据时执行查询。这意味着您需要支付一些文件阅读费用,而不是全部费用。

    如果您需要执行其他操作而不是简单的读取,例如过滤,那么您应该对“用户”集合执行查询。另请记住,如果一位管理员更新集合中的某些内容,您也应该在文档/文档中进行。

    要在自定义对象数组中执行更新,我建议您阅读以下文章:

    我一直使用“文档/文档”,因为您的所有用户很可能无法放入一个文档中。这是因为 Firestore 中的文档有限制。您仅限于1 MiB total of data in a single document。因此,您很可能不得不在多个文档中复制用户数据。

    我也写过一篇文章叫:

    这可能有助于您了解如何降低 Firestore 费用。除此之外,还请记住,免费层用于测试目的,而不是用于应该在现实世界中可用的应用程序。所以你也可以考虑将你的计划升级到Blaze Plan

    但有件事告诉我,出于安全考虑,这毕竟不是一个好主意

    关于安全规则,您可以确保用户文档仅供管理员用户阅读。

    【讨论】:

      【解决方案2】:

      将所有用户添加到单个文档中的数组中存在几个问题:

      • 文档具有1 MB max size limit,因此您可能无法将所有用户存储在一个文档中,最终可能需要添加更多此类文档。
      • 您将无法根据用户文档中的属性进行查询,例如where("age", ">=", 10)。您必须获取所有用户(该文档)并在客户端进行过滤。
      • 如果您需要编写仅允许用户读取/写入自己的文档的安全规则,这可能是不可能的。

      您仍然可以为每个用户创建一个文档(这消除了上面的问题 3),并拥有另一个包含数组中所有用户的文档以供管理员使用。因此,每当管理员查询用户时,只需读取 1 次(或者更多,您需要跨多个文档分片数据)

      【讨论】:

        猜你喜欢
        • 2016-08-20
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 2018-12-14
        • 1970-01-01
        • 2021-10-30
        相关资源
        最近更新 更多