2011-12-06 54 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