我正在开发一个新的网络平台,该平台具有用户,组,这些用户可以获得成就(每个组都有自己的成就)来完成特定任务,这些是我目前的表格:
- 用户
- 组
- Group_users(用于存储用户的组,因为用户可以加入多个组)
- 成就
- User_achievements(用于存储用户的成就,因为用户可以拥有多个成就)
我的问题是,在User_achievements
表中,我应该存储用户和组 ID 还是仅存储保存组和用户之间关系的group_user ID?
首先回答您的问题,我将只将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)
我建议您在users_achievement表中使用user和group_id。原因。
- 在使用选择查询时,您必须进行内部连接以获取用户 ID,这将花费更多时间,因为 SQL 将不得不查看两个表并执行内部连接
- 正如你所说,它是为了user_achievements 而且不是groups_achievements绝对的 而且应该有user_id
:)
1)一项成就是否可以与多个用户(或user_group)相关联?如果答案是多个用户,则需要一个user_achievement表。否则,您只需将用户 ID 放入成就表本身即可。
2) 成就是与user_group相关联还是仅与用户相关联?如果答案user_group,则将用户组 ID 存储在user_group_achievement表中或直接存储在实现表中(请参阅第一个问题)。否则,将用户 ID 存储在表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
因此,用户组、用户成就和组成就之间存在多对多关系。
您可以执行联接来查找:组中的所有用户用户的所有组用户的所有成就成就的所有用户集团的所有成就所有成就组
需要添加联接才能找到与组成就关联的所有用户。