我该如何构建这个组/角色架构?

时间:2011-08-22 06:47:30

标签: database-design role

我正在编写一个具有某些与Google Circle / FB好友列表类似的功能的应用程序。

  1. 用户可以将他们认识的人分组(家人,同事,朋友等) (现在组不能嵌套)
  2. 用户可以向群组发送消息,为每个群组设置隐私设置等
  3. 当在一个群组中共享帖子时,这些群组的用户可以发表评论并查看其他人的评论,无论他们与其他人(在该群组内)之间的关系如何
  4. 目前,由于时间和资源的限制,我们使用关系数据库(mysql)。在任何情况下,我都在努力寻找构建数据库的最佳方法,以平衡性能和清晰度。以下是我们目前的情况:

    users:
      user_id
      default_group_id
      friend_group_id
    
    groups:
      group_id
    
    groups_to_users:
      user_id
      group_id
    
    messages:
      message_id
    
    messages_to_groups:
      message_id
      group_id
    
    galleries_to_groups:
      gallery_id
      group_id
    

    首次创建用户时,他/她将拥有2个基本组:

    1. 仅包含该单个用户的默认组
    2. 将包含他/她所有人的朋友小组
    3. 我们只需使用group_id来确定“权限”,而不是使用user_id。这样我们就可以跳过查询2个表的复杂性。

      与此同时,通过上述结构,我们还遇到了一个障碍,查询了用户收到的所有消息,因为如果此用户有100个朋友,我们可能需要查询至少100个群组。所以现在我们通过这种相当愚蠢的方法解决这个问题:

      如果用户向组发送消息,则我们遍历该组中的成员列表并为每个用户保存记录(message_id,(default_)group_id)。问题是,如果这个组有1000多个成员,那么我们将不得不为发送给该组的每个新消息插入1000多条记录,并且当该用户对该组的成员进行任何更改时,我们还必须更新大量的记录。

      我想知道是否有更好的方法来构建我们的数据库以提高性能?

2 个答案:

答案 0 :(得分:1)

您的“hacky方法”违背了拥有群组的目的,因为您实际上是在写个人链接,而不是使用他们的群组成员资格来合理化您的交易(即消息)。如果你关心的是性能,那么你可能不会通过将你的写入乘以100或1000来获得大幅提升。

我认为你应该坚持使用原始设计,并确保你的表被正确编入索引,以便DBMS可以完成它的构建 - 这是快速有效地连接数据集。

如果您将表设计为具有正确类型的主键和外键,并且如果您设计查询以便利用PK / FK索引,则可以优化性能。

答案 1 :(得分:0)

树结构适合表示这种分层数据

例如 { <使用者> < GUID> UID1< / guid的> <消息> msgid2< /消息> < /使用者> <使用者> < GUID> UID2< / guid的> < /使用者> <组> < GUID> groupid1< / guid的> <&构件GT; UID1< /构件> < /组> <组> < GUID> groupid2< / guid的> <&构件GT; UID1< /构件> <&构件GT; UID2< /构件> <消息> msgid1< /消息> < /组> } 这样数据模型可以灵活地找到

  • 将消息定位到单个用户或组
  • 特定用户的消息列表是发送给用户所属的组列表的消息的累积消息以及直接发送给用户的消息