社交网络数据库架构?

时间:2012-02-06 04:22:24

标签: sql database schema social-networking

用户

    • 链接
      • 用户1
      • 用户2
      • 时间(或其他一些相关链接数据)
    • 帖子

如果用户属于属于该帖子所属的同一组的链接,则用户只能看到帖子。

我想优化数据库以查询给定用户可以看到的所有帖子。构建数据库的最佳方法是什么?

感谢您的帮助!

编辑:以上架构是一个帮助您入门的基本思路。再次感谢!

1 个答案:

答案 0 :(得分:3)

这就是我对此进行建模的方式:

用户(ID等)

这是用户列表。它仅包含用户数据。 PK将是id,因此会有隐式索引

群组(ID等)

这是组列表。它仅包含组数据。 PK将是id,因此会有隐式索引

User_Groups(userId,groupId等)

这是将用户链接到群组的方式。它需要具有用户和组的前导密钥,您可以向其添加任何其他数据,例如,用户加入组时的日期。此处的PK将是userIdgroupId之间的复合键,因此索引将为userIdgroupId。您还希望在groupId中添加其他索引,因为“主要订单”将由userId提供,而不是由groupId

提供

帖子(id,createdByUserId,belongsToGroupId等)

这是帖子列表。帖子仅由用户创建,仅属于一个组。要显示一条帖子,您将使用Users表格加入createdByUserId(以显示创建帖子的用户的名称)。此外,您还需要检查是否确实允许想要查看帖子的用户查看该帖子。因此,您将转到User_Groups表并使用类似于WHERE的{​​{1}}子句(或者您可以加入$currentUserId = users_groups.userId and $currentPostBelongsToGroupId = users_groups.groupId上的表格。)

这是一般的想法。现在,要专注于“优化数据库以查询给定用户可以查看的所有帖子”,您基本上应该按照我在帖子实体描述中所说的做。由于您没有查找特定帖子,因此您必须使用User_Groups加入帖子(此联接将使用在User_Groups实体上创建的post.belongsToGroupId = user_groups.groupId索引),然后使用此处所述的groupId子句。该子句将使用在该实体上创建的复合主键。就是这样。它似乎是一个完全索引的路径。

现在,为什么我没有添加你问题上的WHERE实体?因为我不知道它是什么,你没有回答我的评论,最后询问它是什么。如果它是2个用户之间的链接,则它不应属于某个组,因为用户分别属于组,而不是成对。除此之外,如果链接是我所假设的那么它将不会影响用户如何看待他/她自己允许的帖子。可能与link实体

相关question

希望这有助于或指导您找到更好的解决方案:)