2010-11-03 33 views
1

我試圖使用NHibernate將財務事務保存到數據庫中,並且遇到了一些博客文章,建議使用貨幣類型,其中金額存儲爲雙倍並且貨幣存儲爲一個字符串 - 即數據庫中會有兩個字段。NHibernate - 錢類型 - 表中的多個字段

爲了我的目的,我將在同一個表中有多個財務記錄 - 例如單位價格,美元稅收,美元儲蓄等等。上述方法將起作用,但會導致重複的數據,因爲每一個(在本例中爲3)字段的貨幣類型都會有一列。這是不必要的,因爲貨幣對於價格等的儲蓄總是相同的。 - 如果是一美元,那麼對於另一個是美元...

有沒有人遇到過類似的問題如果是這樣,你能告訴我你最終解決的辦法嗎?

感謝

JP

+4

我最初的反應是:只是與重複共存;它將徹底簡化您的對象模型。 – DanP 2010-11-04 02:14:58

回答

0

我已經看到了同樣的事情,很多地方也是如此,到目前爲止,我沒有看到任何的解釋爲什麼。它有什麼好處?這不是人們如何做生意或邏輯系統如何工作的方式。如果我正在從美國進行國際業務,我的系統仍將具有美元的內部基礎。

貨幣作爲事件的邊界條件很重要,因爲您需要匯率。即使是國際銀行。我現在把我所有的毒品錢都寄到開曼羣島,我的錢也可以用美元計算。也許你的是歐元。所以他們得到它,他們做的是將它們轉換成內部使用的任何貨幣,無論是海貝殼。現在他們必須跟上這個問題,但是他們在任何時候都必須知道的是美元/海貝殼之間的匯率以知道它們對我來說有多大,而海貝/歐元知道它們有多少在你身上。這個小東西不會爲他們蹲下來,要麼它是一個價值對象,它怎麼可能?這種情況下的貨幣將固定在賬戶級別,而不是一堆浮動的東西。

一般來說,貨幣將由某些其他東西固定,就像您觀察到的那樣,在行級別。一行數據是相關的,你應該能夠對貨幣值進行數學計算,在這種情況下,連續的貨幣必須是相同的。也許我在歐洲做生意,不得不以歐元報價。我可能希望爲歷史目的記錄兩種貨幣的報價與付款。我質疑這是否是單行設計,但如果我確定是這樣的話,您描述的Money對象是包含兩個組件的單個值對象。它應該被認爲是一個單一的實體,我認爲我在這裏描述的語義上與「貨幣」對象不同,也可以用十進制/貨幣列明確描述,我們不試圖將它們合成爲一首歌; e Money價值,因爲他們無法與他們進行比較或數學完成。

我只是不會走這條路,因爲會導致混淆語義中細微的不一致,並且可能不會增加任何內容。你究竟在哪裏使用它,行貨幣不會給你同樣的東西,通常是以更合理的方式?

但是,如果一個經理堅持要做一些基本上毫無意義或者更糟糕的事情,就NHibernate而言,你已經聲明瞭一個單一的原子實體,Money恰好有2個組件,一個小數和字符串。由於Money現在是一個單一的原子單位,因此您必須始終爲每個金額都包含兩列,因此沒有避免重複列的解決方法。