2011-03-16 53 views
2

我们正在开发一个股票交易应用程序,并讨论是否应该为货币引入数据类型。金融应用程序中必需的货币数据类型?

提议的Currency数据类型包含货币数量和类型(例如USD,EUR,JPY)。

我现在反对它,因为我们也将它用于持久性bean的属性类型。

首先,它会包含redudant数据。以StockQuote类为例,其中包含给定库存的OHLC(开盘价,最高价,最低价和收盘价)。如果它们中的每一个都由Currency实例表示,那么所有的OHLC都会引用相同的货币类型(例如USD)。在金融应用中,货币价值被广泛使用,而不仅仅是股票报价,所以我们谈论的是大量的冗余。

其次,Currency实例是两个值(金额和货币类型)的组合,所以你要么完全下降的货币类型,并且只有量字段存储在数据库中的表或创建一个货币类型列在表中为每个Currency属性,这在表中是多余的,并且打破第二范式。无论哪种方式,从表中读取一条记录返回到StockQuote对象将是不可能的与JPA和棘手的Hibernate最好。

以前有人遇到过类似的问题吗?金融应用程序拥有自定义货币类别是否正常?如果是这样,你是怎么用JPA/Hibernate实现它的?

+0

使用java.math.BigDecimal或者可能派生自己的基于它的类(使用组合不继承),但不需要重新发明轮子。 – GriffeyDog 2011-03-16 16:21:08

回答

1

值得注意的是,股票并非总是以普通货币报价。例如伦敦证券交易所的股票以便士报价,而不是英镑。交易所中的所有股票都将以相同的货币单位进行报价,因此您可以假设对于特定交易所的特定股票,您知道货币是什么,从而使货币变得多余。所有你需要的是价格。

0

第二范式不是“圣杯”。

有时候最好打破它。 您正在使用财务应用程序。拥有相同的价格是非常重要的。如果数据库中的所有数据具有相同的货币,那么是的,这不是必需的。

但是,如果您使用不同的货币,那么您必须存储每种货币价值的货币类型。你无法避免它。如果你这样做,那么你最终可以用美元计算,而原始价值是用BP或EUR。这会给出非常不同的价值。

顺便说一句:Java有它自己的类:它周围java.util.Currency

+1

确实如此,但java.util.Currency没有数量字段,因此自定义类会将该类加上数量字段。 – 2011-03-16 16:35:38

1

的货币实体模型世界正确,也没有去。

你对StockQuote的争论并不是一个强有力的观点,你可以轻松地将它降低到货币类型的1倍和长整数的4倍。

更新:

@Entity 
public StockQuote { 
    private java.util.Currency currency; // find a nice database mapping of this, or use a ISO 4217 String instead 
    private long open; 
    private long close; 
    private long high; 
    private long low; 

} 

似乎是足够好的数据库映射。当然,如果你让实用的方法,如

MyCurrencyAmount currency = StockQuote.getOpenAsMyCurrencyAmount(); 

然后几乎所有的开销就迎刃而解了。但请注意,您需要java.util.Currency(不包含金额)和您自己的CurrencyAmount(或其他),以及java.util.Currency和金额。

+0

你是否建议结合java.util.Currency字段和双字段的自定义类不是必需的呢? – 2011-03-16 16:39:01

+0

我不会建议货币/金钱的双'字段,但'BigDecimal' – 2011-03-16 16:50:35

+0

@ TheEliteGentleman,我猜你不是指BigDecimal而是BigInteger?那么我会在任何一天与本机类型整数(无逗号!)。所以不要模拟美元,模型美分。 – ThomasRS 2011-03-16 17:01:44