用户
如果用户属于属于该帖子所属的同一组的链接,则用户只能看到帖子。
我想优化数据库以查询给定用户可以看到的所有帖子。构建数据库的最佳方法是什么?
感谢您的帮助!
编辑:以上架构是一个帮助您入门的基本思路。再次感谢!
答案 0 :(得分:3)
这就是我对此进行建模的方式:
用户(ID等)
这是用户列表。它仅包含用户数据。 PK将是id
,因此会有隐式索引
群组(ID等)
这是组列表。它仅包含组数据。 PK将是id
,因此会有隐式索引
User_Groups(userId,groupId等)
这是将用户链接到群组的方式。它需要具有用户和组的前导密钥,您可以向其添加任何其他数据,例如,用户加入组时的日期。此处的PK将是userId
和groupId
之间的复合键,因此索引将为userId
和groupId
。您还希望在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
实体
希望这有助于或指导您找到更好的解决方案:)