我需要一張表來存儲金融交易的狀態。 這個事務的狀態可以粗略地由這個類建模。堅持把錢存入數據庫。設計決策
class FinancialTransaction
{
Integer txId,
Money oldLimit,
Money newLimit,
Money oldBalance,
Money newBalance,
Date txDate
}
class Money
{
Currency curr,
BigDecimal amount
}
我的模式的最初設計是這樣的:
CREATE TABLE tx
(
txId bigint(20) unsigned NOT NULL,
oldlimit_currency varchar(3) NULL,
oldlimit_amount decimal(7,5) default 0.00,
newlimit_currency varchar(3) NULL,
newlimit_amount decimal(7,5) default 0.00,
----snipped----
PRIMARY KEY (txId)
)
有兩件事情讓我擔心:
- 每一筆交易的發生基於一種貨幣。我還沒有想到我是否需要支持可能以多種貨幣發生的交易。假設它不會改變;那麼維持一個貨幣列不是更節省空間嗎?我會後悔這個簡單的解決方案嗎?
- 由於每個Money項目都是一個值對象,我應該將所有Money對象保存到單獨的Money表中並讓原始表使用MoneyIds作爲Money表的外鍵?
也就是說,
CREATE TABLE tx
(
txId bigint(20) unsigned NOT NULL,
oldlimit_money_id int NOT NULL,
newlimit_money_id int NOT NULL,
----snipped----
PRIMARY KEY (txId),
FOREIGN KEY (oldlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION,
FOREIGN KEY (newlimit_money_id) REFERENCES MONEY(id) ON DELETE NO ACTION ON UPDATE NO ACTION
)
有沒有其他的設計?
謝謝lazyweb。
爲什麼您將錢存儲在事務中,而不是通過SQL事務創建引用_Transaction_的新_Money_條目,然後再執行SUM()以檢出狀態。這樣你可以更好地追蹤涉及的金額。 – 2009-01-09 08:17:32