哪一种是支持多币种货币价值的最佳数据库设计?

Bob*_*obs 1 database database-design currency

我想知道在数据库中存储多币种货币价值的最佳数据库设计。例如,我有一个具有两个货币字段的实体。对于每条记录,这些字段可能具有不同的货币类型。

例子:

Table A:
-------------
Id
Name
Amount1
Amount2
Run Code Online (Sandbox Code Playgroud)

样本记录:

Id  Name    Amount1 Amount2
1   aaa     12$     15£
2   bbb     30€     17$
Run Code Online (Sandbox Code Playgroud)

我无法以一种货币存储价值。例如,我想借钱给某人。我将它的数据存储在一个表中。金钱的类型可以不同。当我借给某人 10 欧元时,我应该收回 10 欧元,而且我无法将所有价值存储在一种货币(如美元)中。

我想知道在数据库中存储这些值的最佳和更有效的设计是什么。我应该存储量和货币符号与字符串数据类型一列或者是更好地界定MoneyCurrency表作为存储货币价值单独的表?还是其他设计?

Ben*_*min 5

无需过多评论您的表的实际结构(单个表中的 2 个或更多资金是可以的,只要它们具有商业意义——例如subtotal,shippingFeetotal),我将重点介绍如何存储它们:

存钱

您应该将金额存储在一列中,并将货币代码存储在另一列中。

货币

您通常会处理ISO 4217,它为每种货币提供 2 个代码:

  • 一个 3 个字母的 alpha 代码,例如EURUSD
  • 一个 3 位数字代码,例如978840

您使用哪一种取决于您。您可以使用数字代码为每条记录节省一个字节。另一方面,Alpha 代码对于人类来说更容易阅读和记忆,并且可以更容易地使用自定义货币(加密),它可能具有事实上的标准 alpha 代码但没有数字代码。

数量

因为货币可能有不同的小数位数(2 代表EURUSD等等,但 0 代表JPY,3 代表TND...),我总是建议将金额以次要货币单位(美分)存储为整数。

因此,您的表格将如下所示:

amount INT NOT NULL,
currencyCode CHAR(3) NOT NULL
Run Code Online (Sandbox Code Playgroud)

如果您想存储12.34 USD,您实际上将存储(1234, 'USD')

多个金额,单一货币

如果您的表包含若干款项,将永远是在一个单一货币(如subtotal/ shippingFee/total上面的例子),所有3倍量可以共享一个单一的货币代码:

subtotal INT NOT NULL,
shippingFee INT NOT NULL,
total INT NOT NULL,
currencyCode CHAR(3) NOT NULL
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能不需要单独的subtotalCurrencyCode,shippingFeeCurrencyCodetotalCurrencyCode,尽管还有其他业务案例中的金额将以不同的货币表示。决定权在你。

取回款项

当然,处理整数金额并不是很容易,因此您需要使用支持从/向次要金额转换的货币库。

例如在 PHP 中,您可以使用砖/钱(免责声明:我是作者):

amount INT NOT NULL,
currencyCode CHAR(3) NOT NULL
Run Code Online (Sandbox Code Playgroud)