[英]Which one is the best database design for supporting multi-currency money values?
我想知道在數據庫中存儲多幣種貨幣值的最佳數據庫設計。 例如,我有一個實體,其中有兩個貨幣字段。 這些字段的每個記錄可能具有不同的貨幣類型。
例:
Table A:
-------------
Id
Name
Amount1
Amount2
樣本記錄:
Id Name Amount1 Amount2
1 aaa 12$ 15£
2 bbb 30€ 17$
我無法以一種貨幣存儲值。 例如,我想借錢給別人。 我將其數據存儲在一個表中。 錢的類型可以不同。 當我借給某人10歐元時,我應該取回10歐元,而且我無法以美元等貨幣存儲所有值。
我想知道在數據庫中存儲這些值的最佳和更有效的設計是什么。 我應該將金額和貨幣符號存儲在具有字符串數據類型的一列中,還是最好將“ Money
和“ Currency
表定義為單獨的表來存儲貨幣值? 還是其他設計?
在不對表的實際結構進行過多評論的情況下(在一個表中有2個或更多的貨幣是可以的,只要它們具有業務意義,例如subtotal
, shippingFee
和total
),我將重點介紹如何存儲它們:
您應該將金額存儲在一個列中,將貨幣代碼存儲在另一列中。
您通常會處理ISO 4217 ,每種貨幣帶有2個代碼:
EUR
或USD
978
或840
您使用哪一個取決於您。 您可以使用數字代碼為每條記錄節省一個字節。 另一方面,對於人類而言,alpha代碼更易於閱讀和記住,並且可以更輕松地使用自定義貨幣(密碼),因為自定義貨幣可能具有實際的標准alpha代碼,但沒有數字代碼。
由於貨幣的小數位數可能不同( EUR
, USD
等為2,而JPY
為0, TND
...為3),因此我始終建議以較小的貨幣單位 (美分)將金額存儲為整數。
因此,您的表如下所示:
amount INT NOT NULL,
currencyCode CHAR(3) NOT NULL
如果您想存儲12.34 USD
,則會實際存儲(1234, 'USD')
。
如果您的表中有幾筆將始終使用一種貨幣的貨幣(例如上面的subtotal
/ shippingFee
/ total
示例),那么這三筆金額可以共享一個貨幣代碼:
subtotal INT NOT NULL,
shippingFee INT NOT NULL,
total INT NOT NULL,
currencyCode CHAR(3) NOT NULL
在這種情況下,您可能不需要單獨的subtotalCurrencyCode
, shippingFeeCurrencyCode
和totalCurrencyCode
,盡管在其他一些業務案例中,金額將使用不同的貨幣。 決定權在你。
當然,處理整數金額並不是一件容易的事,因此您需要使用支持從少量金額轉換為少量金額的貨幣庫。
例如,在PHP中,您可以使用Brick / Money (免責聲明:我是作者):
$money = Money::ofMinor(1234, 'USD');
$money->getAmount(); // 12.34
$money->getMinorAmount(); // 1234
課程和金額需要分開。 另外,如果您的列名稱帶有數字,那么您很可能做錯了什么。 這是一種方法:
table products
--------------
id
name
table prices
------------
id
product_id
amount
currency_id
table currencies
----------------
id
name
abbreviation_sign
然后獲取產品的美元價格,您可以執行
select pri.amount
from prices pri
join products prod on prod.id = pri.product_id
join currencies c on c.id = pri.currency_id
where prod.id = 123
and c.name = 'Dollar'
有了適當的索引,查詢起來確實非常快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.