如何为我的用例创建可扩展的 NoSQL 后端?

How do I create a scalable NoSQL backend for my use case?

我正在开发一个约会应用程序的个人项目。我使用的技术堆栈是 React Native with Firebase 来处理所有后端功能(auth、firestore、云函数)。

我希望我的应用程序具有可扩展性,但我承认后端对我来说不是一个巨大的强项。以下是主要特点:

我当前的结构只有 1 个集合:singles,它包含每个用户的文档。例如,我可以通过转到路径 singles/userId.

来检索所有用户的详细信息

我想到的一种可能的解决方案:

如果我提出的解决方案有意义,请告诉我。我也在尝试减少这些计划作业和操作中 read/writes 的数量。

您使用引用 4 个配置文件文档的组文档的解决方案可行,但我对可伸缩性有以下初步担忧:

1.如果用户删除他们的帐户会怎样? 必须从他们的组中删除对他们个人资料的引用。但现在该组只有 3 个,所以你需要尽快填补空位。但是,如果所有用户都已经在一个组中怎么办?

2。如果新用户需要数周或数月才能加入群组怎么办? 一旦开始扩展,这很可能不会成为问题,但一开始呢?用户可以创建一个帐户,并且几个月都不会得到任何“她喜欢你”的匹配项。从用户的角度来看,这是因为没有人觉得他们有吸引力,但实际上是因为加入的用户不够多,无法将他们放在一个群组中。这可能会导致糟糕的用户体验。

3。听起来用户所在的组是永久的。万一进了一个不好的组怎么办? 比如,一个运动员进了一个有一堆学者的组,因此被协会拒绝了。他们的团队可能会歪曲他们的身份,这偶尔是可以的,但如果是永久性的就不好了。

您提到您将把用户的 ID 存储在他们看到的组的子集合中。这是一个非常可扩展的解决方案,但不是最具成本效益的。为了确定用户已经查看了哪些个人资料,他们必须执行集合组查询并找到包含用户唯一 ID 的所有组。对于少数文档,这没问题,但如果用户查看了数千个配置文件组怎么办?这是数以千计的阅读,只是为了确定他们已经看过哪些资料。您可以做的是将所有查看过的用户聚合到用户配置文件之外的单个文档中(您只需要存储组的 uid)。然后,当您接近每个文档 1MB 的限制时,创建第二个文档来存储更多用户等。

这将需要更复杂的代码,但会节省大量读取。额外的代码复杂性是否值得取决于您。

另一种解决方案是将所有用户存储在您的单个集合中,singles,并使用一个属性来指定他们是男性、女性等以及他们的偏好。然后,您可以根据此属性和用户在搜索时的偏好来查询 4 ​​个配置文件。然后,您可以将查看的配置文件存储在用户文档的子集合中。这将有助于缓解上述问题。

此外,要限制为每天 4 个,您可以设置速率限制。在用户文档上跟踪他们今天查看了多少个人资料。然后 运行 每天执行一项 cron 作业,将他们查看的个人资料数量重置为 0。所有这些都将通过您的 Firestore 安全规则强制执行。