存储游戏玩家进度ID';数据库中的s-MySQL中逗号分隔的数据与规范化的MySQL记录(关于服务器性能)
我正在开发一个在线游戏,它将把玩家的进度保存到MySQL数据库中,我正在尝试优化性能。该数据将采用ID的形式,对应于特定的进度成就。这些“成就”包括与NPC对话、发起任务、完成任务等,因此ID将不按特定顺序添加到数据库中。在以下情况下,我目前无法决定如何存储成就数据: 1)作为“播放器”表上逗号分隔的文本字段(例如32,2,53,1,3,5)。 每次触发成就时,相应的ID将添加到文本字段的末尾。PHP端将使用strpo执行检查 2)作为记录存储在玩家进度表中。这可能意味着每个玩家有大量(~100)张唱片,我不知道这会对性能产生什么影响存储游戏玩家进度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
我知道分隔字段是不受欢迎的,但鉴于数据只检查了几次,而且只添加到(而不是删除),我想知道在这种情况下,规范化是否有点过火?如果您总是将所有内容读取到游戏客户端中,请在那里保持状态(可能在字典或哈希表中),然后将数据库用作平面持久性/序列化存储,我可以说这无关紧要 PHP端将使用strpo执行检查 这听起来像是要查询个人成就,这里推荐使用数据库的原因有两个:
SELECT 1
FROM achievements
WHERE playerId = @playerId
AND achievementId = @achievementId
有了正确的索引,这应该是闪电般的快
如果您只有一个字符串,则必须首先从数据库中检索序列化的blob,然后将其解析为可用的数据结构,或者逐个检查每个字符以查找您要查找的数据。这似乎需要更多的开销
作为额外说明,每个玩家100行,即使你有1000000名玩家,也不是真正的“很多”行。一般来说:进行规范化。在你的特定情况下,检查你的用例,看看哪种方法更适合。如果你发现类似“显示完成任务1的所有玩家”,进行规范化。只是规范化!就是这样,不需要这样做!它实际上只是一个完整ID的列表,当玩家登录时从数据库中提取,然后每隔一段时间查询一次,以检查玩家是否有权进行下一步。我很想规范化(这会让事情变得更容易),我真的很担心用太多的记录使表过载:-\n您仍然认为应该进行规范化吗?记录的数量是否会产生影响?我建议进行规范化。如果您因此而体验到负面的性能影响,请更改并迁移ORM中的策略真的不疼。是的!谢谢:)啊,太棒了!!谢谢:)