【问题标题】:What is the best practice for a multi-tenant app with Collection Group Queries in Firestore?在 Firestore 中使用集合组查询的多租户应用程序的最佳做法是什么?
【发布时间】:2025-12-03 15:05:03
【问题描述】:

多租户应用集合组查询的最佳做法是什么?例如查询租户客户的所有发票

/tenant/1/customer/2/invoices

如果我创建一个名为 invoices 的集合组索引,并且我想确保我可以获得租户 1 的所有 invoices,我该如何轻松地做到这一点?

我尝试设置一些安全规则来防止查询租户,但它仍然抛出拒绝访问错误,因为它仍在跨租户查询。正确的 Firestore 规则是什么样的

【问题讨论】:

  • 有一个可接受的答案,但根据您的 cmets,在继续之前需要一些额外的数据。虽然您可以根据@DougStevenson 的建议创建多个项目,但 5 或 10 个可能是可以管理的,但 500 个会失控。例如,Firebase 规则是每个项目。如果您向文档添加新字段,则可能需要通过 Rules 对其进行保护。然后,您必须更新 500 个不同项目规则。我不知道您的代码库,但您还必须拥有 500 个不同的 plist、500 组不同的身份验证等。换句话说,请仔细考虑
  • @Jay 我不担心规则,因为它们在项目之间是一致的,但我更关心通过 ci 部署和保持所有最新状态
  • 明白。试想一下,对规则进行细微调整,然后必须重复该操作 500 次:Firebase 控制台,选择第一个项目-> 规则,粘贴更改,保存。选择项目2->规则,粘贴更改,保存。冲洗,重复 500 次 - 每次进行更改。然后考虑拥有 500 个完全不同的身份验证集和 500 个不同命名的应用程序。顺便说一句,我是 Firebase 的拥护者,但想确保您拥有所有数据。我一开始就没有那条腿,我花了一年的时间来开发,只是为了改变平台。
  • @Jay 但这不能通过一些自动化的 ci 过程来解决吗?
  • 我相信可以通过 Firebase 命令行界面部署规则,但这为项目增加了另一层。尽管我认为它缺少一些功能,例如回滚,而且我认为没有直接的版本控制。不过,请注意额外的复杂性和资源。

标签: firebase google-cloud-firestore


【解决方案1】:

Firebase 项目不太适合多租户应用。建议您为每个租户创建不同的项目。 这将为您在未来省去很多麻烦。

如果您绝对必须对单个项目进行多租户,那么您当前的数据库结构不能很好地支持集合组查询。集合组查询总是查询给定名称的每个集合,没有例外。您不能使用安全规则来过滤结果,因为rules are not filters。过滤只能来自客户端,并由安全规则确认。使用您当前的结构,您需要将租户的 ID 存储在您打算使用集合组查询查询的每个文档中,并让客户端将其用作结果的过滤器。

【讨论】:

  • 我们的应用拥有相当数量的租户,500 人左右,这不会变得更加昂贵。
  • 为什么会这样?如果有的话,成本会下降,因为每个单独的项目都有免费的计费津贴。
  • 项目数量是否有限制或上限?
  • 是的,但它不是静态的,它仅适用于 Spark(免费)计划中的项目。付款计划中的项目数量没有限制。如果您对此有任何疑问或疑虑,应联系 Firebase 支持。 firebase.google.com/support/contact
  • 非常感谢道格!继续努力,你刚刚在这个项目上震撼了我的世界,但可能会变得更好。
最近更新 更多