在包含大量列的MySQLi中存储数据的最佳方法是什么?

时间:2014-02-22 14:13:44

标签: mysql database

我有一个游戏可以在MySQL数据库中以简单和硬模式存储boss杀死。有14个老板。我想存储玩家杀死老板的次数和难度。我有几个选项,我可以看到..

选项1

在表格中为每个老板以及每个难度创建一个单独的列。 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

创建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

选项3

创建一个名为bossKills的单独表,并在老板被杀时简单地将1添加到现有值。 E.g。

playerid,boss,difficulty

我的问题是:当从PHP运行MySQLi查询时,哪些方法会导致服务器负载减少?有没有更好的方法让我不知道?

2 个答案:

答案 0 :(得分:2)

第三种选择是迄今为止最好的选择。

第二个是你应该总是避免的,你可以阅读this answer以获取更多信息,但基本上,你必须寻找数据库规范化,并且这种方法没有规范化:

  

第一范式(1NF)是关系中关系的属性   数据库。如果每个域的关系,则关系是第一范式   attribute仅包含原子值,以及每个属性的值   仅包含该域中的单个值。

如果你这样做,你会遇到这些问题:

  • 您无法使用JOIN
  • 您无法使用索引
  • 搜索,过滤,排序,并不容易
  • 失去参考的能力

如果你改变或扩展游戏的逻辑,第一个选项将非常难以维护,比如添加老板或难度级别,因为它会强制你改变数据库架构。在不久的将来这可能是一个问题。

所以我肯定会使用第三种选择。

答案 1 :(得分:1)

第一种选择并不好,因为你不能轻易添加困难或老板。每次要添加新老板或难度时,您都需要更改数据库架构

第二个选项并不好,因为你将无法轻松运行sql语句并找到例如哪个玩家在boss 3上遇到最多杀戮很容易。为了做类似的事情,你必须解析所有的字符串并从中提取你想要的信息。

第三个选项是最好的,因为你可以轻松添加或删除老板和困难,但你需要更多的sql查询来执行与第一个选项相同的操作

为了存储老板和困难,第三种选择是迄今为止最好的选择。

但有时第一种选择更好。例如

如果你想存储玩家拥有的属性,例如力量,敏捷,智力,命中点,法力点,耐力等,我会选择第一个选项,并将它们放在一个单独的表上,而不是所有其他属性播放器(电子邮件,密码,验证码等)。

我会添加一个单独的表格,例如: player_attributes(player_id,力量,敏捷,智力)

而不是第三个策略的表格 player_attributes(player_id,attribute_id,value)

使用此选项可以更快地在较小的索引上执行查询