我有一个名为users
的表,其中当前包含类型为整数的列money
,其中包含用户当前拥有的金额。
然而,我想扩展并拥有更多基于彼此的货币。1金= 10银= 100铜(或类似的数值)当你获得100枚铜时,它们将转换成1枚黄金。同理,10铜= 1银。所有这些货币在我的表中都有自己的列。我有一个钩子函数,每次请求都调用它,如果可能的话,它会更新钱。
我被告知,虽然我可以使用只有一个列money
,然后我可以玩变量,拿出不同的货币。
但我的问题是:什么是最好的方法?
如果后一种方法是最好的:我如何将变量放入一个已经存在的对象(一个包含用户数据的对象;我想它叫做stdClass
或者类似的东西)?$user->username
等?
只需存储等量的青铜。然后用下面的算法把尽可能多的转化为黄金,剩下的尽可能多的转化为白银,剩下的保持为青铜:
- 将金的数量设置为零,银的数量设置为零,铜的数量设置为数据库显示的任何内容。
- 设置银的数量等于铜的数量除以10(使用整数除法)。设置青铜的数量等于青铜的数量mod 10
- 设置金的数量等于银的数量除以10(使用整数除法)。设置银的数量等于银的数量mod 10。
所以如果你有9,327个青铜:
- 黄金=0,白银=0,青铜= 9327
- 黄金=0,白银=932,青铜=7
- 黄金=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 * 10
即3铜币。
这是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