如果需要,每次在字段中保存关注者计数或查询

Save Followers count in a field or query each time if needed

我想创建一个类似 Twitter 的应用程序。现在我对这个项目的数据库架构有疑问。我想显示每个用户 Followers/Following 在 his/her 个人资料中的计数,例如 Twitter,但我不知道每次都必须从 Followers/Followings table/collection 或这个值中查询用户记录中可以有两个单独的小字段吗?如果我每次查询肯定会花费很多时间和数据库开销。另一方面,如果我为每个用户保存两个字段,当发生更改时,我必须执行 2 个操作,修改关注者或关注者 table 以及用户记录中的这两个字段。我的数据库会很大,数据量很大。

哪种方法是好的和标准的?

嗯,这取决于它是给谁用的?

如果是为您的用户准备的 - 他们可以看到他们有多少关注者。仅当用户登录到您的服务时,我才会执行此 Twitter API 调用。

如果由于某种原因必须为所有用户完成。我认为最好的方法是执行此 followers-count-api-call,例如每小时一次、每两小时一次或每天一次。这可以通过在 cron 中运行的脚本来实现。

您真的需要关注者还是只需要关注者数量?或者两者兼而有之?

如果两者兼而有之,您可以请求 Twitter 用户的关注者并将其限制为 100(如果您的 cron 每分钟至每十五分钟运行一次)。然后将这些关注者 ID 循环到您的数据库并继续插入它们,直到匹配为止。默认情况下,Twitter returns 所有最新关注者 id:s。所以目前这是可能的。

请记住,在请求关注者时,每个用户令牌只能向 Twitter API 发出 15 个请求。此限制可能因不同端点而异。

值得一提的是,我假设您只会获得关注者 ID。那些你一次可以获得5000。如果你想请求追随者对象,每个请求的限制只有 200 个。

希望对您有所帮助 :D

好吧,如果你想知道什么是对的,只有一个答案。

  1. 用户记录中的每个单独字段都包含派生数据(可以通过查询轻松派生的数据)。因此,它构成了重复。因此规范化失败。

  2. 规范化失败的后果是,您有一个更新异常。您不再一个地方有一个事实,您有一个事实在两个地方。每次一个事实发生变化时,每次每个用户的 Followers/Followed 发生变化时,您都必须更新它们。在交易中。

  3. 这不是 "trade-off" 对性能的担忧,那是犯罪。当两地的事实得到"out of synch"的时候,你们的罪行就会被揭穿。您将不得不重新访问应用程序和数据库并执行一些艰苦的工作来进行修正。您可能需要多次这样做。直到您消除导致问题。

性能

至于数据库的负载,如果你的应用是认真的,并且你希望明年能投入业务,那就得到一个真正的SQL平台。

此要求的人口或负载在商业平台上根本不是问题。你总是得到你付出的东西,所以付出一些有价值的东西,并得到一些有价值的东西。

请注意,如果您有数百万用户,这并不意味着您每个用户都有数百万关注者。请注意,您的文件将被编入索引,因此您不会追踪 1600 万用户来计算 25 个关注者,您的索引将允许您在很少的页面中最多 25 个索引行中识别 25 个关注者。这种担忧在商业平台上根本不存在,是没有平台的人的担忧。