我正在开发一个网站,这是一种游戏。用户的进度保存在MySQL数据库中。
我想通过使用列保存(ID)和列进度来保存表,其中progress是数据类型文本。当用户开始时,进度被设置为(例如)'0'。如果他进入第1级,则进度设置为“0#1”,第二级使其为“0#1#2”。级别的顺序是免费的,我想保存它。所以进步可能是'0#4#2#15'等等。
这是一个很好的方法吗?我没有使用SQL的经验,我不想做一些非常愚蠢的事情。我已经阅读了很多关于表格,外键等等的令人困惑的信息......
我想感谢您抽出时间阅读本文,我期待着回答。
赖安
答案 0 :(得分:2)
回答你的问题1
我不会这样解决你的问题。我将创建3个表:一个Levels
表('levelKey'的主键),一个Users
表('userKey'的主键')和一个User_Levels
表,其复合键为'levelKey'和'userKey'。当用户完成一个级别时,只需插入User_Levels
表即可。然后,查看用户是否已完成某个级别是一个简单的选择:
SELECT 'a' FROM User_Levels WHERE userKey = ? AND levelKey = ?
如果行数> 0,用户已完成级别
答案 1 :(得分:2)
至于问题2,我会说查询量不是问题。毕竟,您写数据到数据库,而不是访问它。就个人而言,只要用户实际完成一个级别,我就会向数据库发送“保存”。
观察者发布了一种将关卡和用户分成不同表格的好方法。从进度记录到User_Levels的顺序可以看到进度的顺序,因此不需要存储类似1#3#4#9
的内容您可能希望使用ajax在后台发送保存,因此您不会中断游戏。例如,查看jQuery's $.post method。或者,如果您的游戏是在Flash中,则可以使用URLRequest。
答案 2 :(得分:1)
关于你的第一个问题,如果游戏/等级是非线性的,我会采取不同的方法;我只需添加一个表,其中包含用户ID的列和已完成级别的列。因此,如果用户1已完成级别0,4和7,则我的表将有3行:
UID levels_completed
1 0
1 4
1 7
关于您的其他问题,您可以使用javascript事件和ajax来检测页面的关闭,但我不会依赖它;我会在需要时运行查询。如果你的会话被破坏了,你已经太晚了......