【问题标题】:How to best combine data from key-value stores and databases如何最好地结合来自键值存储和数据库的数据
【发布时间】:2012-04-10 01:36:02
【问题描述】:

假设我们有一个社交网络的朋友列表。

大多数用例都需要将好友列表表加入到您保存个人详细信息的另一个表中,例如:姓名、年龄、城市、个人资料图片 URL、上次登录时间等...

一旦好友列表表在 100M 行范围内。像这样查询 JOIN 可能需要几秒钟。如果你引入一些其他 WHERE 条件,它甚至会更慢。

键值存储系统可以非常快速地引入好友列表。

假设我们想要显示用户最近登录的 10 个好友。 计算此输出的最佳方法是什么?我一直在考虑的一些方法如下。它们中的任何一个都有意义吗?

  • 我们是否应该将所有数据保存在键值存储环境中?更新 每次新登录时都存储键值对?
  • 或者我们应该首先拉取好友列表 ID。然后使用类似“IN()”的数据库命令查询数据库?
  • 在客户端级别合并数据? JavaScript 解决方案?

【问题讨论】:

  • 我会将朋友列表部分放在快速存储中,并使用“IN”查询而不是加入

标签: database nosql key-value


【解决方案1】:

在您的用户表中,您有一个字段来保存上次登录的时间戳。在您的表格中存储了朋友关系,每个关系都有 1 行,这使得表格非常长。

所以加入这些表似乎很糟糕,我们应该以某种方式优化这个过程吗?答案是:不,不一定。构建 DBMS 的人与您有同样的问题,他们实施了解决这些问题的工具。每个 DBMS 都有某种比你我更聪明的查询优化。

所以加入长桌并不丢人。如果您想尝试优化,您可以:

  • 获取用户好友的ID。
  • 获取您想要的前 10 个朋友的信息,按 last_login desc 排序,其中 id 适合(以及其他 where 条件)。

您不需要连接表,但您将使用两个查询,因此如果您的 DBMS 很智能,连接速度可能会更快(可能运行测试)。

如果你愿意,你可以在页面加载后使用ajax来加载这些数据,这样可以提高用户的体验,但是DB上的流量会是一样的。

我希望这会有所帮助。

编辑:哦,是的,如果你已经知道朋友的 ID(你需要它们来做其他事情),你甚至不需要加入。您可以将 ID 传递给稍后通过 AJAX 加载最后登录列表的 javascript。

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2010-10-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多