我需要一张表来存储金融交易的状态。 这个事务的状态可以粗略地由这个类建模。坚持把钱存入数据库。设计决策
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