社交网络数据库架构?

3

用户

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

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

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

感谢您的帮助!

编辑:上面的架构是一个基本的想法,可以让您开始工作。再次感谢!


我不太理解实体“link”。这是读作“User1自从Time以来一直是User2的朋友”吗?如果是这样,为什么链接属于一个组?我理解它是一个用户属于一个组。请让我知道您对此的想法。 - Mosty Mostacho
很抱歉这么久才回复你。以下是我的想法:一个用户拥有一个包含多个其他用户的群组。我需要存储关于其中多个用户何时与父用户见面的数据,这就是为什么我想包含链接对象。链接由涉及到的两个用户共同拥有,因此他们都可以看到彼此何时和在哪里见面。与此同时,如果你再次查看该父用户,你应该能够通过遍历所有群组、遍历这些群组中的所有用户(通过链接对象)来获取每个用户所属的帖子。 - Andrew
你需要查询多个用户的帖子,以生成汇总列表。 考虑到需要经常进行查询,因此此帖子查询应尽可能减少资源消耗。 - Andrew
1个回答

3
这是我的建模方式:
用户列表(id、等等)
这是用户列表,包含只有用户数据。主键将是id,因此会有一个隐式索引。
组列表(id、等等)
这是组列表,包含只有组数据。主键将是id,因此会有一个隐式索引。
用户_组(userId、groupId、等等)
这是链接用户到组的方法。它需要具有关联到用户和组的外键,并且您可以在其中添加任何其他数据,例如用户加入组的日期。在这里,PK将是userId和groupId的复合键,因此索引将是userId和groupId。您还需要在groupId上有一个附加索引,因为“主要顺序”将由userId而不是groupId给出。
帖子列表(id、createdByUserId、belongsToGroupId、等等)
这是帖子列表。帖子仅由一个用户创建,并属于一个组。要显示帖子,您将使用Users表中的createdByUserId连接(以显示创建帖子的用户名称)。此外,您还会想要检查想要查看帖子的用户实际上是否被允许查看它。因此,您将进入User_Groups表并使用类似于$currentUserId = users_groups.userId and $currentPostBelongsToGroupId = users_groups.groupId的WHERE子句(或者您可以将该表连接到post.belongsToGroupId = user_groups.groupId上)。
这是一般想法。现在,要专注于“优化数据库以查询给定用户允许查看的所有帖子”,您应该基本上执行我在帖子实体描述中所述的操作。由于您不正在寻找特定的帖子,因此必须将帖子与User_Groups连接(此连接将使用在User_Groups实体上创建的groupId索引),然后再使用那里面的WHERE子句。该子句将使用在该实体上创建的复合主键。就是这样。它似乎是一个完全索引化的路径。
现在,我为什么没有添加你在问题中提到的“link”实体呢?因为我不知道它是什么,而且你也没有回答我在上面留言中询问的问题。如果这是两个用户之间的链接,那么它就不应该属于一个组,因为用户单独属于一个组,而不是成对出现。除此之外,如果这个链接是我所假设的那样,它对于用户如何查看自己被允许的帖子的性能不会产生任何影响。可能与“link”实体相关的问题,请参考此处
希望这可以帮助你或者指引你找到更好的解决方案 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接