sql - 社交网络数据库架构?

标签 sql database schema social-networking

<分区>

用户

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

只有当用户属于与帖子所属的同一组的链接时,用户才能看到帖子。

我想优化数据库以查询允许给定用户查看的所有帖子。为此构建数据库的最佳方式是什么?

感谢您的帮助!

编辑:上述模式是让您入门的基本思路。再次感谢!

最佳答案

这就是我的建模方式:

用户(id 等)

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

群组(id 等)

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

用户组(用户 ID、组 ID 等)

这是将用户链接到组的方法。它需要具有用户和组的外键,并且您可以向其中添加任何其他数据,例如,用户加入组的日期。这里的PK是userIdgroupId之间的复合键,所以索引就是userIdgroupId。您还希望在 groupId 中有一个额外的索引,因为“主要订单”将由 userId 给出,而不是由 groupId

帖子(id、createdByUserId、belongsToGroupId 等)

这是帖子列表。帖子仅由一个用户创建,并且仅属于一个组。要显示帖子,您需要将 createdByUserId 与 Users 表连接起来(以显示创建帖子的用户的姓名)。此外,您需要检查是否真的允许想要查看该帖子的用户查看它。因此,您将转到 User_Groups 表并使用类似于 $currentUserId = users_groups.userId 和 $currentPostBelongsToGroupId = users_groups.groupIdWHERE 子句(或者您可以加入post.belongsToGroupId = user_groups.groupId 上的表)。

这是一般的想法。现在,要专注于“优化数据库以查询允许给定用户查看的所有帖子”,您基本上应该按照我在帖子实体描述中所说的进行操作。由于您不是在寻找特定的帖子,因此您必须使用 User_Groups 加入帖子(此加入将使用在 User_Groups 实体上创建的 groupId 索引),然后使用 WHERE 子句也在那里说明。该子句将使用在该实体上创建的复合主键。就是这样。它似乎是一个完全索引的路径。

现在,为什么我没有添加您在问题中遇到的 link 实体?因为我不知道它是什么,而且你没有回答我在上面问它是什么的评论。如果它是 2 个用户之间的链接,那么它不应该属于一个组,因为用户属于单独的组,而不是成对的。除此之外,如果链接是我所假设的,那么它根本不会影响用户如何查看他/她自己允许的帖子的性能。可能相关questionlink 实体

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

关于sql - 社交网络数据库架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155545/

相关文章:

sql - 使用总和将 SQL 表行转为 3 列

SQL IF block 代码导致错误,即使它不应该执行

java - 将数字添加到字符串中?

sql - 消息 16929,游标为只读 - 为什么?

database - Apache Hive的实际行业应用是什么?

SQL Server 创建用户定义的表类型时架构无法正常工作

数据库架构 - 预订/可用性系统

仅当元素与 sql 相同时,Php 才回显用户信息

database - Cassandra 数据中心复制与 Couchbase 数据中心复制

javascript - 您可以将属性添加到通过 json - ld 标记的现有微数据模式吗?