背景故事
在我开始提问之前先讲一个小故事。
- 我正在开发一个Mysql驱动的网站,它允许人们跟踪用户为"复古"游戏创造了成就
- 到目前为止,我一直在手工追踪这些成就,但喜欢通过基于荣誉的自我检查为每个人打开它系统
- 我已经完成了登录,所以有一个登录表,上面有username和密码。(还有其他专栏,我认为这对答案(
- 最初,我打算为每个用户创建一个表,我希望可能会达到数千,但在阅读了网站上的帖子后要明白这是个坏主意
问题
我的问题如下:
最有效的表格结构是什么?
- 我希望每个用户都有一个每个游戏的成就列表已实现和未实现的代表,因此他们需要能够从预设列表中添加游戏
- 会有多个列表,因为大多数人都有一个以上的游戏
- 我认为这是一种多对多的关系,但我不太确定如何将所有元素链接在一起,以便我可以开始编写查询
感谢您阅读这篇文章和提供的任何建议。
您可能应该有一个用户、游戏、成就和用户成就表。成就表中的每个条目都可以链接到一个游戏id。当用户达到某个成就时,您可以在user_achievements表中添加一个具有user_id和成就_id的条目。如果没有该用户和成就的条目,那就意味着他们还没有实现。
您可以创建几个表示系统中每个部分的选项卡。实例
Table 'Users':
id
username
password
usesgames
Table 'Games':
id
gamename
gamedescription
Table 'Achievements':
id
gameid
userid
achievement
points
现在,您可以创建尽可能多的用户,而不会干扰成就,反之亦然。想象一下,你创建了两个游戏。帝国时代与帝国时代II。这些将通过在数据库中创建
1 Age of Empires - A fun strategy game
2 Age of Empires II - Version two of a fun strategy game
假设用户"BoomBlaster"拥有这两款游戏,你可以在用户"usesgames"选项卡行中创建一个逗号分隔的列表,就像这个
1,2
想象一下你使用PHP,你可以通过使用explode();
函数来分离它们
$games = "1,2";
$gamesarray = explode(",",$games);
然而,你现在可以将用户和游戏连接起来,在数据库表"成就"中获取成就
SElECT * FROM Achievements WHERE gameid = $gameid AND userid = $userid;
我希望你明白我的意思。顺致敬意,乔纳斯