Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储游戏玩家进度ID';数据库中的s-MySQL中逗号分隔的数据与规范化的MySQL记录(关于服务器性能)_Mysql_Sql_Database_Normalization_Delimited - Fatal编程技术网

存储游戏玩家进度ID';数据库中的s-MySQL中逗号分隔的数据与规范化的MySQL记录(关于服务器性能)

存储游戏玩家进度ID';数据库中的s-MySQL中逗号分隔的数据与规范化的MySQL记录(关于服务器性能),mysql,sql,database,normalization,delimited,Mysql,Sql,Database,Normalization,Delimited,我正在开发一个在线游戏,它将把玩家的进度保存到MySQL数据库中,我正在尝试优化性能。该数据将采用ID的形式,对应于特定的进度成就。这些“成就”包括与NPC对话、发起任务、完成任务等,因此ID将不按特定顺序添加到数据库中。在以下情况下,我目前无法决定如何存储成就数据: 1)作为“播放器”表上逗号分隔的文本字段(例如32,2,53,1,3,5)。 每次触发成就时,相应的ID将添加到文本字段的末尾。PHP端将使用strpo执行检查 2)作为记录存储在玩家进度表中。这可能意味着每个玩家有大量(~100

我正在开发一个在线游戏,它将把玩家的进度保存到MySQL数据库中,我正在尝试优化性能。该数据将采用ID的形式,对应于特定的进度成就。这些“成就”包括与NPC对话、发起任务、完成任务等,因此ID将不按特定顺序添加到数据库中。在以下情况下,我目前无法决定如何存储成就数据:

1)作为“播放器”表上逗号分隔的文本字段(例如32,2,53,1,3,5)。 每次触发成就时,相应的ID将添加到文本字段的末尾。PHP端将使用strpo执行检查

2)作为记录存储在玩家进度表中。这可能意味着每个玩家有大量(~100)张唱片,我不知道这会对性能产生什么影响


我知道分隔字段是不受欢迎的,但鉴于数据只检查了几次,而且只添加到(而不是删除),我想知道在这种情况下,规范化是否有点过火?

如果您总是将所有内容读取到游戏客户端中,请在那里保持状态(可能在字典或哈希表中),然后将数据库用作平面持久性/序列化存储,我可以说这无关紧要

PHP端将使用strpo执行检查

这听起来像是要查询个人成就,这里推荐使用数据库的原因有两个:

  • 您不希望每次向服务器发出请求时都读取整个字符串并对其进行反序列化。请求之间的状态不会在不费吹灰之力的情况下保持不变。我阅读上述语句的意思是,此游戏不是在本地客户端上运行的,而是在浏览器中不断向服务器发出请求
  • 您可以利用数据库的强大功能
  • 使用规范化数据库,您只需通过以下查询检查给定玩家的成绩:

    SELECT 1
    FROM achievements
    WHERE playerId = @playerId
    AND achievementId = @achievementId
    
    有了正确的索引,这应该是闪电般的快

    如果您只有一个字符串,则必须首先从数据库中检索序列化的blob,然后将其解析为可用的数据结构,或者逐个检查每个字符以查找您要查找的数据。这似乎需要更多的开销


    作为额外说明,每个玩家100行,即使你有1000000名玩家,也不是真正的“很多”行。

    一般来说:进行规范化。在你的特定情况下,检查你的用例,看看哪种方法更适合。如果你发现类似“显示完成任务1的所有玩家”,进行规范化。只是规范化!就是这样,不需要这样做!它实际上只是一个完整ID的列表,当玩家登录时从数据库中提取,然后每隔一段时间查询一次,以检查玩家是否有权进行下一步。我很想规范化(这会让事情变得更容易),我真的很担心用太多的记录使表过载:-\n您仍然认为应该进行规范化吗?记录的数量是否会产生影响?我建议进行规范化。如果您因此而体验到负面的性能影响,请更改并迁移ORM中的策略真的不疼。是的!谢谢:)啊,太棒了!!谢谢:)