2011-12-06 48 views
1

我有一个名为users的表,其中当前包含的列为money整数类型包含用户当前拥有的金额。如何在SQL中存储多个虚拟货币

但是,我想扩大并有其他几种基于对方的货币。 1金= 10银= 100铜(或类似的东西)。当你获得100个铜牌时,他们会转换成1个金牌。 10青铜= 1银也是一样。 所有这些货币在我的表格中都有自己的专栏。我有一个钩子函数,如果可能的话,在每个请求中调用并更新资金。

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

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

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

+0

需要注意的是你的问题的标题有点误导(并包含一个错字),因为这个问题是不是'真正的'货币。对于实际货币,它们之间的关系会波动,因此所需的解决方案会有所不同。 –

回答

4

只需存储相当数量的青铜。然后使用下面的算法来获得尽可能多的转化为黄金,从其余尽可能银,其余停留在铜牌:

  1. 设置的金为零,白银的数量为零,青铜无论数据库说什么。
  2. 设置银的数量等于青铜的数量除以10(使用整数除法)。设置青铜的数量等于青铜MOD 10的数量。
  3. 设置黄金的数量等于白银的数量除以10(使用整数除法)。设置银等于银国防部10

这样的数量多少,如果你有9327青铜:

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

是intval()的方式去确保它是一个整数除法? –

0

我以前做过类似的事情,我同意你应该只有一列“钱”,并根据需要计算其他货币。如果你有独立的列,你将不得不依靠触发器或应用程序逻辑来保持它们的同步。

0

我会将所有东西都转换成青铜色并存储该值。任何类型的交易也将首先转化为铜牌。唯一需要转换为银色或黄金的时间才能显示。

0

的一种方法是仅存储所有货币青铜。

这样,如果你有123铜牌,你可以将它们转换

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

剩下的都是123 - NumGold * 100

所以你必须

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

剩下的都是23 - NumSilver * 10即青铜硬币。

这是SQL只知道大约青铜币和显示他们如金,银是所有在应用层

0

接受的答案不超过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 
+0

我相信这只是接受答案的伪代码。假设'/'表示整数除法。 – Palec