我正在编写一个具有某些与Google Circle / FB好友列表类似的功能的应用程序。
目前,由于时间和资源的限制,我们使用关系数据库(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个基本组:
我们只需使用group_id来确定“权限”,而不是使用user_id。这样我们就可以跳过查询2个表的复杂性。
与此同时,通过上述结构,我们还遇到了一个障碍,查询了用户收到的所有消息,因为如果此用户有100个朋友,我们可能需要查询至少100个群组。所以现在我们通过这种相当愚蠢的方法解决这个问题:
如果用户向组发送消息,则我们遍历该组中的成员列表并为每个用户保存记录(message_id,(default_)group_id)。问题是,如果这个组有1000多个成员,那么我们将不得不为发送给该组的每个新消息插入1000多条记录,并且当该用户对该组的成员进行任何更改时,我们还必须更新大量的记录。
我想知道是否有更好的方法来构建我们的数据库以提高性能?
答案 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< /消息> < /组> } 这样数据模型可以灵活地找到