2009-01-09 39 views
4

我需要一張表來存儲金融交易的狀態。 這個事務的狀態可以粗略地由這個類建模。堅持把錢存入數據庫。設計決策

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) 
) 

有兩件事情讓我擔心:

  1. 每一筆交易的發生基於一種貨幣。我還沒有想到我是否需要支持可能以多種貨幣發生的交易。假設它不會改變;那麼維持一個貨幣列不是更節省空間嗎?我會後悔這個簡單的解決方案嗎?
  2. 由於每個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。

+0

爲什麼您將錢存儲在事務中,而不是通過SQL事務創建引用_Transaction_的新_Money_條目,然後再執行SUM()以檢出狀態。這樣你可以更好地追蹤涉及的金額。 – 2009-01-09 08:17:32

回答

4

貨幣和貨幣價值是兩個不同的概念,所以更好地將它們分開。沒有必要爲'價值'製作一個單獨的表格,但是最好有一個用於貨幣,因爲這些是單獨的實體。新設計將如下所示:

CREATE TABLE tx 
(
    id bigint(20) unsigned primary key, 
    old_limit_currency_id int not null references CURRENCY(id), 
    old_limit_value decimal(7,5) not null, 
    new_limit_currency_id int not null references CURRENCY(id), 
    new_limit_value decimal(7,5) not null 
) 

此外,檢查十進制(7,5)是否有足夠的空間用於您的方案,它看起來有點低。有句老話:「安全性高於遺憾」

+0

感謝您指出小數點(7,5)。我一定會和DBA一起審查這個問題。 – ashitaka 2009-01-09 09:33:04

2
  1. 如果將來您確實需要支持兩種貨幣之間的交易,那麼應該有可能將此模型作爲兩種交易的一種貨幣進行建模。
  2. 看起來你的Money對象在語義上是值而不是實體。因此我不認爲有必要將它們作爲實體分開。
-3

如果這不是一個矯枉過正的行爲,更進一步,將所有的金額/價值存儲在一個貨幣,並維持一個匯率表。

+0

您需要維護整個匯率歷史記錄才能執行有效的計算,以便在過去引用交易 – miceuz 2009-01-09 09:13:31

2

什麼約三分之一的想法:

CREATE TABLE tx 
(
    txId bigint(20) unsigned NOT NULL, 
    currency varchar(3) NOT NULL, 
    oldlimit decimal(7,5) default 0.00, 
    newlimit decimal(7,5) default 0.00, 
    ----snipped---- 
    PRIMARY KEY (txId) 
) 

一個交易的所有貨幣價值必須是同一種貨幣的,對不對?

+0

這是我可能考慮的一個不錯的優化。謝謝 – ashitaka 2009-01-09 09:31:03