簡體   English   中英

哪一種是支持多貨幣貨幣價值的最佳數據庫設計?

[英]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個或更多的貨幣是可以的,只要它們具有業務意義,例如subtotalshippingFeetotal ),我將重點介紹如何存儲它們:

儲存款項

您應該將金額存儲在一個列中,將貨幣代碼存儲在另一列中。

貨幣

您通常會處理ISO 4217 ,每種貨幣帶有2個代碼:

  • 3個字母的字母代碼,例如EURUSD
  • 3位數字代碼,例如978840

您使用哪一個取決於您。 您可以使用數字代碼為每條記錄節省一個字節。 另一方面,對於人類而言,alpha代碼更易於閱讀和記住,並且可以更輕松地使用自定義貨幣(密碼),因為自定義貨幣可能具有實際的標准alpha代碼,但沒有數字代碼。

由於貨幣的小數位數可能不同( EURUSD等為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

在這種情況下,您可能不需要單獨的subtotalCurrencyCodeshippingFeeCurrencyCodetotalCurrencyCode ,盡管在其他一些業務案例中,金額使用不同的貨幣。 決定權在你。

取款

當然,處理整數金額並不是一件容易的事,因此您需要使用支持從少量金額轉換為少量金額的貨幣庫。

例如,在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM