2011-08-22 57 views
0

我正在编写一个应用程序,它具有与Google圈子/ FB好友列表类似的某些功能。我应该如何构建这个组/角色模式?

  1. 用户可以把他们知道的人到一群人(家族,同事,朋友等) (现在组不能嵌套)
  2. 用户可以将消息发送到组(S),设定每组隐私设置等
  3. 在一个职位组内共享,这些群体的用户可以发表评论,并看到其他人的评论,无论他们与其他人的关系(即组内)

现在,我们正在使用关系数据库(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. 的默认组朋友组,其中将包含他/她与朋友的所有人

我们将简单地使用group_id来确定“许可”,而不是使用user_id。这样我们可以跳过查询2个表格的复杂性。

与此同时,通过上述结构,我们也遇到了查询用户收到的所有消息的障碍,因为如果此用户有100个朋友,我们可能必须查询至少100个组。所以现在我们用这个相当黑客的方法来解决这个问题:

如果用户发送消息给一个组,然后我们浏览这个组中的成员列表并保存每个用户的记录(message_id,(default_ )GROUP_ID)。问题是,如果这个组拥有1000多个成员,那么我们将不得不为每个发送到这个组的新消息插入1000多条记录,并且当这个用户对组成员进行任何修改时,我们也必须更新大量的记录。

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

回答

0

树结构是合适的配合来表示这种分层数据

例如 { <用户的> <GUID> UID1 </GUID > <消息> msgid2 < /消息> < /用户> <用户> <guid> uid2 </guid > </user > <组> <GUID> groupid1 </GUID > <构件> UID1 < /构件> < /组> <组> <GUID> groupid2 </GUID > <构件> UID1 < /构件> <构件> UID2 < /部件> <消息> msgid1 < /消息> < /组> } 使得数据模型可以是柔性的,以找到

  • 目标消息到单个用户或一组消息的
  • 列表中的特定用户是累积消息寻址到组的列表用户的成员,给用户的邮件直接
+0

Nageswara Rao,请您详细说明如何将数据存储在数据库中?我有点慢在这里 – mr1031011

+0

您可以通过在groups_to_users引入一些冗余 例 users_to_groups --------------- USER_ID --->用户ID <解决用例冗余数据,以避免查询用户和组表> USER_ID --->组识别符号 messages_to_group ----------------- GROUP_ID - > MESSAGE_ID USER_ID --- > message_id 所以,如果你想让一个组的成员通过group_id查询groups_to_users –

1

你“哈克法”失败,因为你实际上是书面形式链接到个人,而不是使用它们的组成员合理化您的交易有团体的目的(即消息)。如果您关注的是性能,那么你很可能不会通过100或1000

的一个因素,我认为你应该与原设计坚持,并确保你的表格你写相乘得到您读了巨大的推动正确编入索引,以便DBMS可以完成它所要做的事情 - 快速高效地连接数据集。

如果您设计的表具有正确的主键和外键,并且您设计了查询以便他们利用PK/FK索引,那么您将如何优化性能。

+0

你是对的,没有必要sen d 1000+这样的消息,我们可以使用当前结构并使用join – mr1031011