mysql - 数据库选择: frequently querying 2nd degree connections

标签 mysql facebook-graph-api database-schema social-networking database-performance

我的网络应用程序需要始终查询二级连接。假设每个用户有 200 个 friend ,这些 friend 每个都有 200 个 friend 。我可以使用一些帮助来确定正确的数据库(和表结构),以使这个 Web 应用程序快速且响应灵敏。

业务逻辑:用户搜索其一级和二级关系,以获取使用特定服务的其他用户的列表(以unsigned int形式存储在一列中)。这是此应用程序的唯一功能。

表结构:

  • 用户表:User_ID (pk)、Facebook_ID (sk)、姓名、特定服务、位置
  • 关系表:尚未确定。

问题:我阅读了很多帖子并在网上搜索了“社交网络数据库设计”。然而,这些应用程序感觉与我的有很大不同。我将拥有许多用户(超过 1000 万),但只有一个小型数据库,并且仅运行业务逻辑中描述的一个查询。

其他信息:用户只能使用其 Facebook 帐户注册(并随后登录)。他们的 friend 也将被邀请(通过 Facebook)注册。好友注册后,关系表将被填充(仅限活跃/未阻止/未待处理的好友)。因此我可以从关系表中删除“友谊状态”列。

最佳答案

您需要一个包含两个 id 的表;它将定义一个“ friend ”。这种关系是对称的吗?也就是说,如果A是B的 friend ,那么B是A的 friend 吗?好吧,当两者都发生时,我假设有 2 行。

然后

CREATE TABLE Friends (
    user1 ...,
    user2 ...,
    PRIMARY KEY(user1, user2),
    INDEX(      user2, user1)
) ENGINE=InnoDB;

SELECT a.name, c.name
    FROM Users AS a
    JOIN Friends AS ab  ON ab.user1 = a.user_id
    JOIN Users AS b  ON b.user_id = ab.user2
    JOIN Friends AS bc  ON bc.user1 = b.user_id
    JOIN Users AS c  ON c.user_id = bc.user2
    WHERE a.user_id = ?

关于mysql - 数据库选择: frequently querying 2nd degree connections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38265259/

相关文章:

api - 如何获取页面帖子列表,包括页面的幽灵/暗帖子?

facebook - 不使用 "publish_actions"发布照片的 Facebook API 替代方案

database - 了解数据库模式

javascript - Express:请求的模块不提供名为 'User' 的导出

Facebook FB.ui 发送方法不适用于移动网络,需要替代方法

sql-server - 数据库架构澄清

MYSQL 求和与减法

mysql - utf-8 字符集 txt 文件转换为 mysql 在 macos 上无法正确显示

mysql - Eloquent sql 查询将具有相似值的所有列分组并获得每个组的相似结果

php - Mysql、php和时间差异