PHP/SQL:调平/XP系统,供网站用户使用.我应该如何存储数据?考虑会话


PHP/SQL: Leveling/XP System for users on a website. How should I store the data? Thinking about sessions

我希望用户能够在我的网站上获得XP(经验点)。在达到一定数量后,它们会升级。

我需要关于如何处理所有数据的建议。更确切地说:XP的数量和它所代表的级别。

  • 用户级别将显示在每个页面顶部的一个栏中页面。
  • 甚至可能是XP
  • 它应该是有效的(不是非常繁重的数据库)
  • 需要的经验值每关都不一样(级别越高,需要的经验值越多)

我使用CodeIgniter我的网站。
我的PHP技能介于初学者和老手之间,我猜:)


我的第一个想法:

"数据库只"
将xp存储在已经存在的"user"表中的一列中。为了获得相应的级别,我将创建另一个包含2列的表:例如:

1—0
2—100
3—500
等。

不得不承认,我真的不知道如何从这一点得到的水平,还。但我想这是可行的。但这意味着我必须连接到数据库,每次从两个表检索数据。我不认为这是个好办法。这里是

我的第二个想法:


"更新会议"将XP存储为会话数据,并在"用户"表中为XP创建一个列。每次XP的变化,我将不得不更新会话数据和数据库,但我不需要访问数据库来检索XP的数量。我可以从会话数据中得到。(安全问题? !我使用CodeIgniters加密会话)

为了获得关卡,我可能会在"user"表中添加另一列来存储关卡。代替数据库中存储所需XP的额外表,我可以使用php函数来获取相应的级别(?)。明白了吗?将节省额外的数据库连接。
例如:get_level($xp)

为了更新关卡,我必须在每次改变XP时检查关卡。这样有效率吗?

我怎样才能得到一个已知XP数的相应级别?我可以使用PHP开关吗?


你可以看到,我不知道我在做什么;p
有很多想法,但似乎没有一件能达到理想的效果。

任何帮助/建议都是感激的:)


我将有一个单独的表来跟踪每个用户的事件及其相应的XP调整:

  • xp_events
    • event:事件作为字符串或外键ID或其他。
    • user:查询的用户。
    • delta:对应的XP变化。

然后将总经验值和当前级别与用户一起存储。向xp_events添加触发器,以便在添加XP事件时更新用户表中的总XP和当前级别。我建议不要更改或删除xp_events中的条目,审计跟踪非常有用,您可以通过添加另一个事件来撤销一个事件。

这种方法为您提供了几乎免费的摘要信息,因此您不必做一堆额外的聚合来计算您的用户列表页面。你也可以在xp_events中获得一个很好的审计历史,或者只是以防人们想要看到他们的进展。作为额外的奖励,您可以在xp_events中获得审计跟踪,当您的触发器中有错误时,您可以使用它来重新生成每个用户的总XP和当前级别。

您还希望在数据库中拥有xp-to-level信息,您的触发器将需要它,并且无论如何将所有数据保存在数据库中都不会有什么坏处。像这样:

min_xp | level
-------+------
     0 | 1
   100 | 2
   500 | 3
  1000 | 4
...

然后你可以得到$xp XP的水平:

select max(level)
from xp_levels
where $xp - min_xp >= 0

您需要将XP存储在数据库中并每次都进行查询。您可以将其存储在会话等中,但除了可能充当短期缓存之外,它没有太大意义……但我怀疑你是否会注意到任何性能成本(会话也不是免费的)。非常简单和重复的查询基本上是免费的。

将Level存储在数据库中可能是一个好主意,而不是从XP中派生…但这取决于你。如果你不想存储它,那就保存一个包含所有关卡及其XP需求的数组。然后你只需遍历数组,直到找到与用户所拥有的经验值相对应的关卡。

如果没有更具体的问题,我发现很难比这更深入。

但是总结一下,在数据库中存储XP,如果你想的话也可以设置关卡…并每次查询。

p。此外,如果您是初学者,请确保在将所有用户数据放入SQL查询之前对其进行转义!mysql_real_escape_string()……或者你会发现一些用户做了各种各样你不希望他们做的事情。

PS2。忘掉这个级别上的性能问题吧,你根本不会遇到它们……如果你开始循环往复,每次请求都要查询成千上万条记录……然后你需要再次检查你在做什么。