gpt4 book ai didi

mysql - 在数据库中存储和保存玩家背包(库存)

转载 作者:行者123 更新时间:2023-11-29 11:06:03 29 4
gpt4 key购买 nike

是否有最好的方法在关系数据库中存储诸如玩家背包之类的数据?

假设我想将玩家背包存储在数据库中。

表“eq”的数据库模型如下所示:

玩家 ID |槽 |商品编号 |金额

现在假设我在数据库中有这一行:

1 | 10 | 10 20 | 99

这意味着,ID 为 1 的玩家在第 10 个位置拥有 99 个 ID 为 20 的元素。将这些数据读取到游戏中很容易(如果带有插槽 Y 的行不存在,则意味着该行为空),但保存这些数据有点棘手。为什么?因为如果玩家使用了 99 个 id 20 的元素,他的背包在 RAM 中将是空的,但数据库中仍然会有行。同样,当玩家将元素移动到另一个插槽上时,如何知道何时删除数据库中的插槽?

这是我的两个想法,看起来很糟糕:

  1. 当玩家注册新帐户时,我可以将 X 个空行添加到“eq”表中,其中包含他的 id 和以下插槽(1、2、3、4...),然后在保存时迭代玩家 eq 并更新属于玩家的每一

  2. 当保存过程开始时,删除属于玩家的所有“eq”行,然后将这些行插入数据库,其中包含项目(保留空槽)

最佳答案

如果您的背包尺寸固定或很少变化,而且不是太大,那么在注册期间为所有插槽创建行可能会有好处。我认为这意味着索引仅在添加或删除玩家时更新,并且优化器使用的统计数据应该保持稳定和有效。使用 INSERT ... ON DUPLICATE KEY UPDATE ... 可能是个好主意对这样的表进行查询,以确保在意外删除行的情况下它能够 self 修复。它的效率不应该比仅执行 UPDATE 低。 .

您还应该能够进行单独的插槽更新。每当玩家使用背包中的元素时,UPDATE该插槽的内容。如果添加了新项目,请发送 INSERT命令。如果使用了槽中的最后一个项目,请发送 DELETE命令代替。当元素被移动时,您只需 UPDATE更改插槽号的行。您的内存中应该有足够的上下文来确定要做什么,并且任何时候都只能有一个玩家登录一个帐户,对吗?如果你预先创建插槽,你只需做合适的 UPDATE命令而不是 INSERT/DELETE命令。

如果由于某种原因您无法更新单个插槽,您可以通过两次查询保存整个背包。我会发送 INSERT ... ON DUPLICATE KEY UPDATE ...命令,其中包含包含项目的每个插槽的值。然后我会发送一个 DELETE FROM eq WHERE playerId = ...查询,如果背包不空,则追加AND slot NOT IN (...)以及已填充插槽的列表。这样,您就不会删除和创建不必要的行,这应该会更有效。通过预先创建的槽,您可以在一个查询中完成此操作。

关于mysql - 在数据库中存储和保存玩家背包(库存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394968/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com