社交网络DB架构?
- 组
- 链接
- 用户1
- 用户2
- 时间(或其他一些相关的链接数据)
- 帖子
- 链接
如果用户属于属于该帖子所属的同一组的链接,则用户只能看到帖子。
我想优化数据库以查询给定用户被允许查看的所有帖子。构建数据库来执行此操作的最佳方法是什么?
感谢您的帮助!
编辑:上面的模式是一个基本的想法,让你开始。再次感谢!
这是我怎么会对此建模:
用户(身份证等)
这是用户列表。它只包含用户数据。在PK将是id
,所以会出现有一个隐含的指数
组(身份证等)
这组列表中。它只包含组数据。在PK将是id
,这样就会有一个隐含的指数有
User_Groups(用户ID,的groupId等)
这是用户链接到组的方式。它需要拥有用户和组的外键,并且您可以添加任何其他数据,例如用户加入组的日期。此处的PK将是userId
和groupId
之间的复合关键字,因此索引将为userId
和groupId
。你也想拥有在groupId
附加指标,因为“主令”将被userId
给予,而不是由groupId
帖子(ID,createdByUserId,belongsToGroupId等)
这是帖子列表。帖子仅由用户创建,只属于一个组。要显示一篇文章,您将加入用户表的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
实体?因为我不知道它是什么,你没有回答我的评论,询问它是什么。如果它是2个用户之间的链接,则它不应该属于一个组,因为用户分别属于组,而不是成对。除此之外,如果链接是我所设想的,那么就不会影响用户看到他/她自己允许的帖子的表现。可能与question到link
实体
希望这有助于或引导你到一个更好的解决办法:)
我不完全得到实体'link'。那是因为“User1自从Time以来一直是User2的朋友”吗?如果是这样的话,为什么链接属于一个组?我将它理解为属于一个组的用户。让我知道你是如何看待这个 – 2012-02-06 05:00:39
对不起,花了这么长时间才能回到你身边。以下是我的想法:用户有一个其他多个用户的组。我需要存储关于例如当多个用户中的一个遇到父用户时,这就是为什么我想包含链接对象的原因。该链接由参与该链接的两个用户拥有,因此他们都可以看到他们什么时候见面以及在哪里见面。同时,如果您再次查看该父级用户,则应该能够遍历所有组,并通过这些组中的所有用户(通过链接对象)获取属于每个用户的帖子---- – Andrew 2012-05-20 18:57:10
----这些多个用户,因此您可以生成帖子的聚合列表。考虑到它需要经常进行,这个帖子查询应该尽可能地少用资源。 – Andrew 2012-05-20 18:59:38