我设计了一个基于MySQL数据库的游戏成就系统。每个成就有3个级别,每个级别包含不同的奖励。成就及其等级和奖励对每个用户都是相同的。
表achievement
:
| id_achievement|标题|描述|等级_1|二级|等级_3|奖励_1|奖励_2|奖励_3|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|- -----|
描述列将为VARCHAR
,包含如何实现成就的描述,并为级别值提供占位符。每个级别都是INT
(完成该级别所需的值)。
表user_achievement
:
| id_user| id_achievement|进展|奖励_收集|成就完成|
| - -----|- -----|- -----|- -----|- -----|
我的想法是通过比较进度和成就的级别来计算成就的级别。
请指出缺点并提出改进建议(效率、存储等)。一个问题是,如果用户在完成下一个成就等级之前没有收集他们完成成就等级的奖励,则先前的奖励将被覆盖/跳过。
2条答案
按热度按时间h6my8fg21#
您的初始设计是一个良好的开端。但是,您需要关注一些领域以提高设计效率,并解决您提到的问题。下面提到一些建议,
1.单独的成就和水平:
成就:id_achievement(PK),title,description
级别:id_level(PK),id_achievement(FK),level_number,requirement
奖励:id_reward(PK),id_achievement(FK),level_number,reward_details
1.创建一个表来存储用户在级别级别而不是成就级别的进度。
user_achievement_progress:id_user(FK),id_level(FK),progress
1.创建一个表来跟踪记录集合,同时防止覆盖或跳过记录。
user_reward_collection:id_user(FK),id_reward(FK)
还提到正在使用VARCHAR,因此请确保列具有适当的长度,以便优化存储。
gtlvzcf82#
您应该使用一个规范化的表,它将需要更多的表,但要保持表中没有repattitions
业绩
| id_achievement|标题|描述|
| - -----|- -----|- -----|
级别
| id_achievement|水准仪|项目编号|奖赏|
| - -----|- -----|- -----|- -----|
user_achievement
| id_user| id_achievement|进展|地位|水准仪|
| - -----|- -----|- -----|- -----|- -----|
状态
| ID_status|达到的地位|
| - -----|- -----|
| 1|奖励_收集|
| 2|成就完成|