这是我的建模方式:
用户列表(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”实体相关的问题,请参考
此处。
希望这可以帮助你或者指引你找到更好的解决方案 :)