如何为我的用例创建可扩展的 NoSQL 后端?
How do I create a scalable NoSQL backend for my use case?
我正在开发一个约会应用程序的个人项目。我使用的技术堆栈是 React Native with Firebase 来处理所有后端功能(auth、firestore、云函数)。
我希望我的应用程序具有可扩展性,但我承认后端对我来说不是一个巨大的强项。以下是主要特点:
- 每个用户每天将收到 4 个符合他们对 'Men'、'Women' 或 'Everyone' 偏好的配置文件。 Location/Proximity 或年龄不是偏好的一部分。 这类似于 Coffee Meets Bagel 每个用户每天收到有限数量的 'Bagels'。
- 当 Tammy 喜欢 Dave 的个人资料时,Tammy 会出现在 Dave 的主屏幕上,并带有一个标签,上面写着:“她喜欢你”。
- 届时,Dave 可以与 Tammy 配对,两人将开始聊天 window。
我当前的结构只有 1 个集合:singles
,它包含每个用户的文档。例如,我可以通过转到路径 singles/userId
.
来检索所有用户的详细信息
我想到的一种可能的解决方案:
- 假设平台上有 1000 位单身人士,并且至少有 40% 的女性和 60% 的男性,个人资料流通才会开始。我 运行 一个计划的作业,它创建了一个 Men 集合(150 个文档,每个文档有 4 个文档引用)、Women(100 个文档,每个文档有 4 个文档引用)和一个混合集合(250 个文档,每个文档有 4 个文档引用)文件参考)。今天 Tammy 打开应用程序时,她会看到一个她以前从未见过的男性组的随机文件。当她看到该组时,我们会将她的 userId 写入该文档的子集合中,以便我们可以跟踪她已经看到它(因此不会再次出现)。对于 Dave,我们可以做同样的事情,只是向他展示一个包含 4 个女性的随机文档,并将他的 userId 写入该文档的子集合中。然后,对于每 4 个新男性注册,我们可以触发一个云函数将一个新文档写入男性集合。对于每 4 个新的女性注册,我们可以将一个新文档写入女性集合。这样,对于想看男人的用户,我们有 150 多天的内容作为一个良好的开端。而对于女性来说,有100+天的领先优势,对于那些想见大家的人来说,有250+天的领先优势。
如果我提出的解决方案有意义,请告诉我。我也在尝试减少这些计划作业和操作中 read/writes 的数量。
您使用引用 4 个配置文件文档的组文档的解决方案可行,但我对可伸缩性有以下初步担忧:
1.如果用户删除他们的帐户会怎样? 必须从他们的组中删除对他们个人资料的引用。但现在该组只有 3 个,所以你需要尽快填补空位。但是,如果所有用户都已经在一个组中怎么办?
2。如果新用户需要数周或数月才能加入群组怎么办? 一旦开始扩展,这很可能不会成为问题,但一开始呢?用户可以创建一个帐户,并且几个月都不会得到任何“她喜欢你”的匹配项。从用户的角度来看,这是因为没有人觉得他们有吸引力,但实际上是因为加入的用户不够多,无法将他们放在一个群组中。这可能会导致糟糕的用户体验。
3。听起来用户所在的组是永久的。万一进了一个不好的组怎么办? 比如,一个运动员进了一个有一堆学者的组,因此被协会拒绝了。他们的团队可能会歪曲他们的身份,这偶尔是可以的,但如果是永久性的就不好了。
您提到您将把用户的 ID 存储在他们看到的组的子集合中。这是一个非常可扩展的解决方案,但不是最具成本效益的。为了确定用户已经查看了哪些个人资料,他们必须执行集合组查询并找到包含用户唯一 ID 的所有组。对于少数文档,这没问题,但如果用户查看了数千个配置文件组怎么办?这是数以千计的阅读,只是为了确定他们已经看过哪些资料。您可以做的是将所有查看过的用户聚合到用户配置文件之外的单个文档中(您只需要存储组的 uid)。然后,当您接近每个文档 1MB 的限制时,创建第二个文档来存储更多用户等。
这将需要更复杂的代码,但会节省大量读取。额外的代码复杂性是否值得取决于您。
另一种解决方案是将所有用户存储在您的单个集合中,singles
,并使用一个属性来指定他们是男性、女性等以及他们的偏好。然后,您可以根据此属性和用户在搜索时的偏好来查询 4 个配置文件。然后,您可以将查看的配置文件存储在用户文档的子集合中。这将有助于缓解上述问题。
此外,要限制为每天 4 个,您可以设置速率限制。在用户文档上跟踪他们今天查看了多少个人资料。然后 运行 每天执行一项 cron 作业,将他们查看的个人资料数量重置为 0。所有这些都将通过您的 Firestore 安全规则强制执行。
我正在开发一个约会应用程序的个人项目。我使用的技术堆栈是 React Native with Firebase 来处理所有后端功能(auth、firestore、云函数)。
我希望我的应用程序具有可扩展性,但我承认后端对我来说不是一个巨大的强项。以下是主要特点:
- 每个用户每天将收到 4 个符合他们对 'Men'、'Women' 或 'Everyone' 偏好的配置文件。 Location/Proximity 或年龄不是偏好的一部分。 这类似于 Coffee Meets Bagel 每个用户每天收到有限数量的 'Bagels'。
- 当 Tammy 喜欢 Dave 的个人资料时,Tammy 会出现在 Dave 的主屏幕上,并带有一个标签,上面写着:“她喜欢你”。
- 届时,Dave 可以与 Tammy 配对,两人将开始聊天 window。
我当前的结构只有 1 个集合:singles
,它包含每个用户的文档。例如,我可以通过转到路径 singles/userId
.
我想到的一种可能的解决方案:
- 假设平台上有 1000 位单身人士,并且至少有 40% 的女性和 60% 的男性,个人资料流通才会开始。我 运行 一个计划的作业,它创建了一个 Men 集合(150 个文档,每个文档有 4 个文档引用)、Women(100 个文档,每个文档有 4 个文档引用)和一个混合集合(250 个文档,每个文档有 4 个文档引用)文件参考)。今天 Tammy 打开应用程序时,她会看到一个她以前从未见过的男性组的随机文件。当她看到该组时,我们会将她的 userId 写入该文档的子集合中,以便我们可以跟踪她已经看到它(因此不会再次出现)。对于 Dave,我们可以做同样的事情,只是向他展示一个包含 4 个女性的随机文档,并将他的 userId 写入该文档的子集合中。然后,对于每 4 个新男性注册,我们可以触发一个云函数将一个新文档写入男性集合。对于每 4 个新的女性注册,我们可以将一个新文档写入女性集合。这样,对于想看男人的用户,我们有 150 多天的内容作为一个良好的开端。而对于女性来说,有100+天的领先优势,对于那些想见大家的人来说,有250+天的领先优势。
如果我提出的解决方案有意义,请告诉我。我也在尝试减少这些计划作业和操作中 read/writes 的数量。
您使用引用 4 个配置文件文档的组文档的解决方案可行,但我对可伸缩性有以下初步担忧:
1.如果用户删除他们的帐户会怎样? 必须从他们的组中删除对他们个人资料的引用。但现在该组只有 3 个,所以你需要尽快填补空位。但是,如果所有用户都已经在一个组中怎么办?
2。如果新用户需要数周或数月才能加入群组怎么办? 一旦开始扩展,这很可能不会成为问题,但一开始呢?用户可以创建一个帐户,并且几个月都不会得到任何“她喜欢你”的匹配项。从用户的角度来看,这是因为没有人觉得他们有吸引力,但实际上是因为加入的用户不够多,无法将他们放在一个群组中。这可能会导致糟糕的用户体验。
3。听起来用户所在的组是永久的。万一进了一个不好的组怎么办? 比如,一个运动员进了一个有一堆学者的组,因此被协会拒绝了。他们的团队可能会歪曲他们的身份,这偶尔是可以的,但如果是永久性的就不好了。
您提到您将把用户的 ID 存储在他们看到的组的子集合中。这是一个非常可扩展的解决方案,但不是最具成本效益的。为了确定用户已经查看了哪些个人资料,他们必须执行集合组查询并找到包含用户唯一 ID 的所有组。对于少数文档,这没问题,但如果用户查看了数千个配置文件组怎么办?这是数以千计的阅读,只是为了确定他们已经看过哪些资料。您可以做的是将所有查看过的用户聚合到用户配置文件之外的单个文档中(您只需要存储组的 uid)。然后,当您接近每个文档 1MB 的限制时,创建第二个文档来存储更多用户等。
这将需要更复杂的代码,但会节省大量读取。额外的代码复杂性是否值得取决于您。
另一种解决方案是将所有用户存储在您的单个集合中,singles
,并使用一个属性来指定他们是男性、女性等以及他们的偏好。然后,您可以根据此属性和用户在搜索时的偏好来查询 4 个配置文件。然后,您可以将查看的配置文件存储在用户文档的子集合中。这将有助于缓解上述问题。
此外,要限制为每天 4 个,您可以设置速率限制。在用户文档上跟踪他们今天查看了多少个人资料。然后 运行 每天执行一项 cron 作业,将他们查看的个人资料数量重置为 0。所有这些都将通过您的 Firestore 安全规则强制执行。