如何在SQL中存储多个虚拟货币


How to store more than one virtual currency in SQL

我有一个名为users的表,其中当前包含类型为整数的列money ,其中包含用户当前拥有的金额。

然而,我想扩展并拥有更多基于彼此的货币。1金= 10银= 100铜(或类似的数值)当你获得100枚铜时,它们将转换成1枚黄金。同理,10铜= 1银。所有这些货币在我的表中都有自己的列。我有一个钩子函数,每次请求都调用它,如果可能的话,它会更新钱。

我被告知,虽然我可以使用只有一个列money ,然后我可以玩变量,拿出不同的货币。

但我的问题是:什么是最好的方法?

如果后一种方法是最好的:我如何将变量放入一个已经存在的对象(一个包含用户数据的对象;我想它叫做stdClass或者类似的东西)?$user->username等?

只需存储等量的青铜。然后用下面的算法把尽可能多的转化为黄金,剩下的尽可能多的转化为白银,剩下的保持为青铜:

  1. 将金的数量设置为零,银的数量设置为零,铜的数量设置为数据库显示的任何内容。
  2. 设置银的数量等于铜的数量除以10(使用整数除法)。设置青铜的数量等于青铜的数量mod 10
  3. 设置金的数量等于银的数量除以10(使用整数除法)。设置银的数量等于银的数量mod 10。

所以如果你有9,327个青铜:

  1. 黄金=0,白银=0,青铜= 9327
  2. 黄金=0,白银=932,青铜=7
  3. 黄金=93,白银=2,青铜=7

我以前做过类似的事情,我同意您应该只使用一列表示"货币",并根据需要计算其他货币。如果您有单独的列,则必须依赖触发器或应用程序逻辑来使它们保持同步。

我会将所有内容转换为青铜,并仅存储该值。任何类型的交易也将首先转换为铜币。只有在显示时才需要转换成白银或黄金。

一种方法是只将所有货币存储在Bronze中。

如果你有123青铜,你可以转换它们

123 / 100   //Gold with integer division which should be 1

其余为123 - NumGold * 100 ie 23

所以你有

23 / 10  // Silver with integer division should be 2

剩余为23 - NumSilver * 103铜币。

这是SQL只知道铜币并将其显示为金,银都在应用层

可接受的答案不考虑超过9999的值,因为它将为银增加10,并给出错误的输出。

最好的解决方案是:

var bronze, silver, gold;
var myMoney = 32141; // number from database
bronze = myMoney % 10;
myMoney = (myMoney - bronze) / 10;
silver = myMoney % 10;
gold = (myMoney - silver) / 10;
输出:

gold = 321
silver = 4
bronze = 1