我有一个游戏可以在MySQL数据库中以简单和硬模式存储boss杀死。有14个老板。我想存储玩家杀死老板的次数和难度。我有几个选项,我可以看到..
在表格中为每个老板以及每个难度创建一个单独的列。 E.g。
playerid,(all the other player fields here),boss1easy,boss1hard,boss2easy,boss2hard,boss3easy,boss3hard,boss4easy,boss4hard,boss5easy,boss5hard,boss6easy,boss6hard,boss7easy,boss7hard,boss7easy,boss7hard,boss8easy,boss8hard,boss9easy,boss9hard,boss10easy,boss10hard,boss11easy,boss11hard,boss12easy,boss12hard,boss13easy,boss13hard,boss14easy,boss14hard
创建2个字段,用于存储一系列数字,以后可以提取这些数字以便在PHP中进行比较。 easykills是一个包含28个字符的字符串,每2个字符一个计数器,用于表示老板被杀的次数。例如。显然限制计数最多99次杀戮:
playerid,(all the other player fields),easykills,hardkills
easykills = "2103030405060708091011121314" = boss1easy = 21 kills, boss2easy = 03 kills, boss3easy = 03 kills, boss4esay = 04 kills, etc
创建一个名为bossKills的单独表,并在老板被杀时简单地将1添加到现有值。 E.g。
playerid,boss,difficulty
我的问题是:当从PHP运行MySQLi查询时,哪些方法会导致服务器负载减少?有没有更好的方法让我不知道?
答案 0 :(得分:2)
第三种选择是迄今为止最好的选择。
第二个是你应该总是避免的,你可以阅读this answer以获取更多信息,但基本上,你必须寻找数据库规范化,并且这种方法没有规范化:
第一范式(1NF)是关系中关系的属性 数据库。如果每个域的关系,则关系是第一范式 attribute仅包含原子值,以及每个属性的值 仅包含该域中的单个值。
如果你这样做,你会遇到这些问题:
如果你改变或扩展游戏的逻辑,第一个选项将非常难以维护,比如添加老板或难度级别,因为它会强制你改变数据库架构。在不久的将来这可能是一个问题。
所以我肯定会使用第三种选择。
答案 1 :(得分:1)
第一种选择并不好,因为你不能轻易添加困难或老板。每次要添加新老板或难度时,您都需要更改数据库架构
第二个选项并不好,因为你将无法轻松运行sql语句并找到例如哪个玩家在boss 3上遇到最多杀戮很容易。为了做类似的事情,你必须解析所有的字符串并从中提取你想要的信息。
第三个选项是最好的,因为你可以轻松添加或删除老板和困难,但你需要更多的sql查询来执行与第一个选项相同的操作
为了存储老板和困难,第三种选择是迄今为止最好的选择。
但有时第一种选择更好。例如
如果你想存储玩家拥有的属性,例如力量,敏捷,智力,命中点,法力点,耐力等,我会选择第一个选项,并将它们放在一个单独的表上,而不是所有其他属性播放器(电子邮件,密码,验证码等)。
我会添加一个单独的表格,例如: player_attributes(player_id,力量,敏捷,智力)
而不是第三个策略的表格 player_attributes(player_id,attribute_id,value)
使用此选项可以更快地在较小的索引上执行查询