Database 如何最好地组合键值存储和数据库中的数据

Database 如何最好地组合键值存储和数据库中的数据,database,nosql,key-value,Database,Nosql,Key Value,假设我们有一个社交网络的好友列表 大多数用例都需要将好友列表表加入到另一个表中,您可以在其中保存个人详细信息,例如:姓名、年龄、城市、个人资料图片URL、上次登录时间等 一旦好友列表表在100M行范围内。像这样查询联接可能需要几秒钟的时间。如果你引入一些其他的条件,它甚至会更慢 一个键值存储系统可以很快将好友列表带入 假设我们想显示用户最近登录的10个好友。 计算该输出的最佳方法是什么?下面是我一直在思考的一些方法。它们有什么意义吗 我们是否应将所有数据保存在键值存储环境中?更新 每次新登录时

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

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

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

一个键值存储系统可以很快将好友列表带入

假设我们想显示用户最近登录的10个好友。 计算该输出的最佳方法是什么?下面是我一直在思考的一些方法。它们有什么意义吗

  • 我们是否应将所有数据保存在键值存储环境中?更新 每次新登录时都要存储键值
  • 或者我们先把朋友名单上的身份证拿出来。然后使用像“IN()”这样的数据库命令查询数据库
  • 是否在客户端级别合并数据?javascript解决方案

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

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

所以加入长桌也没什么丢脸的。如果您想尝试优化,您可以:

  • 获取用户朋友的ID
  • 获取您想要的前10个好友的信息,这些好友按id所在的上次登录描述(以及其他where条件)排序
您不需要联接表,但将使用两个查询,因此,如果您的DBMS是智能的,联接可能会更快(可能会运行测试)

如果愿意,可以在加载页面后使用ajax加载此数据,这可以改善用户的体验,但DB上的流量将是相同的

我希望这有帮助


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

我会将好友列表部分放在快速存储中,并使用“in”查询而不是join