【问题标题】:Database query for events based on friends going基于朋友去的事件的数据库查询
【发布时间】:2020-04-07 06:56:47
【问题描述】:

我正在尝试为用户构建包含事件的时间线。

要构建此时间线,我将运行一个执行以下操作的查询:

  • 返回用户的朋友准备参加的所有活动。

我现在拥有的:

  • client-side:一个用户所有朋友的 id 列表:例如。 ['a', 'b', 'c', 'd', 'e']
  • 服务器端:包含所有事件的 Firestore 集合:

    事件/事件ID

    这个文档有一个值“going”,它是一个包含所有“going”用户 ID 的列表。 ['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm']

(例如,查询应该返回此文档,因为有 2 个朋友要去)

一个简单的解决方案是:

获取所有事件并在客户端比较两个列表。问题:对于 100 个文档来说没问题,但如果集合规模扩大则不可能。 (因为 Firstore 会在文件上读取账单。)

有没有更好的方法来做到这一点(使用 Firestore)?

或者这在 Firestore 中是不可能的吗?是否有其他技术可以做到这一点?

提前致谢!

【问题讨论】:

  • 这是一个既宽泛又不清楚的问题。您正在构建一个时间线,但您的数据是基于朋友表示“去”的方式,这并不是真正的时间线。此外,我们对您的数据或这些数据的相关性一无所知。您能否包括您尝试过的代码,更清晰的数据定义,您是否还可以澄清所要求的内容?请花点时间查看How do I ask a good question?How to create a Minimal, Complete, and Verifiable example。更新,我们来看看!
  • 谢谢!我更新了问题,如果现在清楚,请告诉我。

标签: sql database firebase google-cloud-firestore


【解决方案1】:

问题中没有代码,我不知道平台,所以让我从高层次上回答这个问题。

假设我们有一个users 集合:

users
   uid_0
      name: Larry
      friends:
         uid_1: true
         uid_2: true
      events_where_friends_are_going:
         event_0:
            uid_1: true
            uid_2: true         
   uid_1
      name: Moe
      friends:
         uid_2: true
      events_where_friends_are_going:
         event_0:
            uid_2: true
   uid_2
      name: Curly

假设我们有一系列事件存储在一个集合中:

events
   event_0
      name: "some event"
      signups:
         uid_1: true
         uid_2: true //Curly signed up

该过程是当用户注册一个事件时,例如event_0,他们被添加到该事件集合中,然后通过@查询与他们成为朋友的所有其他用户的users集合987654328@子收藏。然后他们将自己添加到 events_where_friends_are_going,如果该事件不存在则创建该事件,如果存在,则将自己添加到列表中。

在上述结构中,如果 Curly 注册了 event_0,如 signups 集合中所示,查询显示他们是 uid_0 和 uid_1 的朋友。然后将它们添加到 uid_0 和 uid_1 events_where_friends_are_going 集合中。

【讨论】:

  • 谢谢!看起来像一个有效的解决方案!但它是否具有成本效益?因为如果用户有 100 个朋友。设置到一个事件需要 101 次写入。我认为那会很贵?
  • 由您决定什么是“昂贵”的预算。请参阅Firestore Pricing。请记住,免费 Spark 计划包括 20K/天,这是很多朋友和活动。如果写入次数超过此值,您将获得 0.18 的 10 倍(0.18 美元/10 万美元)。最后,如果所有这些都太多了,请考虑使用实时数据库,因为这是按演出计算的,而不是按写入计算的,而且您正在写入少量数据。如果这个答案有帮助,请务必接受它可以帮助其他人。见How To Accept
  • 谢谢!所以我想我会选择实时数据库,因为写入是免费的。我计划创建一个函数来删除已结束的事件,这样我就不必存储太多数据。我认为这个设置是我所需要的,你认为它具有可扩展性和面向未来的能力吗?
  • @KarelDebedts 只有当数据量小于限制时,写入才是免费的 - 之后您需要为数据付费。数据量不是问题,因为 Firebase 可以轻松处理数百 GB。所以是的,它是可扩展的。
  • 哦,好的,谢谢!写入量的限制是多少?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多