2013-07-15 86 views
1

這根本不是一個編程問題。讓我解釋一下:我正在創建一個遊戲,爲此我需要一個數據庫來存儲用戶註冊數據(例如用戶名,電子郵件,密碼)。如果用戶獲勝,他/她將獲得現金積分。用戶可以通過真實貨幣兌換他/她的現金積分,所以我認爲現金積分是非常非常重要的數據。我的問題是:你會將現金積分數據存儲在同一個「用戶」表中嗎?或者你會創建一個名爲「現金」(例如)的新表,然後將其存儲到? (從安全角度來看)將關鍵數據存儲到MySQL數據庫

感謝

+3

你應該只存儲用戶密碼的散列。從來沒有實際的密碼。 – Jashaszun

+0

通過「散列」,這意味着您正在使用特定於密碼的散列方法,如[bcrypt](http://en.wikipedia.org/wiki/Bcrypt)。 – tadman

回答

1

如果您實施簡單的總帳系統,最好將交易作爲信用或借方記錄在用戶帳戶中,並且帳戶本身具有可以審計的總額。

必須如果您涉及現金或類似現金的貨幣,則保留執行的交易記錄。如果有人抱怨缺錢,您需要能夠驗證每一筆影響其餘額的交易,並發現任何差異。

這也假定您正在利用事務來避免提交未完成的事務。餘額調整和交易記錄應該是同一交易的一部分。

一如既往,測試這是儘可能無情的,你可以。

+0

所有的答案都很棒,但我選擇了這個答案,因爲它讓我想......我該如何實現這樣一個複雜的交易系統?你能推薦我關於這個問題的任何演講嗎?你能告訴我如何保持交易記錄嗎?貝寶是否可以幫助我完成這項任務?乾杯! –

+0

你需要記錄'(tx_id,account_id,amount)',其中'tx_id'是一個事務標識符,'account_id'表示有問題的帳號,'amount'是一個正數或負數。這樣帳戶的「餘額」應該是'SELECT SUM(金額)FROM account_transactions WHERE account_id =?'但出於性能原因,這可以保存到'accounts.balance'列中。通常一個賬戶的借方是來自另一個賬戶的貸方,反之亦然,所以如果您發行遊戲幣,您將從這個賬戶中扣除一個「來自」來允許審計。 – tadman

+0

在某些學派的思想下,「SUM(金額)」應該總是等於零。這是所有的信用和借記互相取消。這樣金錢永遠不會神奇地出現在任何地方,你只是在移動它。這也使它對你的會計很友善。 – tadman

1

它被認爲是不好的設計,如果你存儲在用戶表中的現金分。表格應該是normalized。您應該將現金點存儲在單獨的表中,並使用userId作爲該表中的外鍵。您也可以查看加密現金點表數據。

1

Cashpoints肯定在單獨的表中,但不是從安全角度。從設計的角度來看,它會更好,並且允許您爲每個用戶保留一次CashPoint更改日誌。

1

那麼你應該創建一個類似於銀行餘額的數據庫設計。這樣你可以跟蹤所有的變化,這是

create table balance 
(id int, 
debit numeric (10,2), 
credit numeric (10,2), 
balance_before numeric(10,2), 
balance_after numeric(10,2), 
timestamp datetime, 
user_id int, 
description varchar(32), 
... 
);