如何构建用户/组/成就数据库?

时间:2014-03-04 19:57:53

标签: database many-to-many schema usergroups

我正在开发一个新的网络平台,让用户,小组和那些用户可以获得成就(每个小组都有自己的成就)来完成特定任务,这些是我目前的表格:

  • 用户
  • Group_users (用于存储用户的 组,因为用户可以加入多个组)
  • 成就
  • User_achievements (用于存储用户的成就,因为用户可以拥有多项成就)

我的问题是,在User_achievements表中,我应该存储用户和组ID还是仅存储包含组和用户之间关系的group_user id?

3 个答案:

答案 0 :(得分:2)

首先回答您的问题,我会将user_id作为外键存储在user_achievements表中,因为成就链接到用户而不是此表中的组。

如果成就也链接到该组,正如您在对另一个答案的评论中所提到的那样,该关系应显示在成就表中,而不是user_achievements表。

为什么Group_users表有自己唯一的id(你似乎暗示它是),它不仅仅是一种加入多对多关系的方式吗?如果是这种情况,为什么不只是将group_users表的主键设置为user_id外键和groups_id外键的组合。表格不需要唯一的ID,因为两个外键的组合本身就是唯一的。

编辑:

所以我这样做:

Users table:
    id (Primary Key)
    ... What ever other data you want to store for the user ...

Groups:
    id (Primary Key)
    ... What ever other data you want to store for the group ...

Group_users:
    user_id (Foreign Key to users.id) (Part of primary key)
    group_id (Foreign Key to groups.id) (Part of primary key)

Achievements:
    id (Primary Key)
    group_id (Foreign Key to groups.id)
    ... What ever other data you want to store for the achievement ...

User_achievements:
    achievement_id (Foreign key to achievements.id) (Part of primary key)
    user_id (Foreign key to users.id) (Part of Primary Key)

答案 1 :(得分:0)

我建议你在users_achievement表中使用user和group_id。的原因。

  1. 在使用select查询时,你必须创建一个innerjoin来获取用户id,这需要花费更多时间,因为SQL必须查看两个表并执行内部连接
  2. 正如你所说的for user_achievements而不是groups_achievements肯定而且user_id应该在那里
  3. :)

答案 2 :(得分:0)

1)成就是否可能与多个用户(或user_group)相关联? 如果答案是多个用户,那么您需要一个user_achievement表。否则,您可以将用户ID放入成就表本身。

2)成就与user_group或仅与用户相关联吗? 如果回答user_group,则将用户组ID存储在user_group_achievement表中或直接存储在achivement表中(请参阅第一个问题)。否则,将用户标识存储在user_achievement表或user_group_achivement表中(同样,第一个问题)。

users
-------
user_id
user_name


groups
-------
group_id
group_name


user_groups
-----------
user_id
group_id


achievments
------------
achievement_id
achievement_name


user_achievements
-----------------
user_id
achievment_id


group_achievements
-----------------
group_id
achievement_id

因此,您在用户组,用户成就和群组成就之间存在许多关系。

你可以做联接找到: 组中的所有用户 用户的所有组 用户的所有成就 所有用户的成就 团队的所有成就 所有成就小组

需要额外加入才能找到与小组成就相关联的所有用户。