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

Database 哪一种是支持多种货币价值的最佳数据库设计?,database,database-design,currency,Database,Database Design,Currency,我想知道在数据库中存储多货币货币值的最佳数据库设计。 例如,我有一个实体有两个货币字段。对于每个记录,这些字段可能具有不同的货币类型 例如: Table A: ------------- Id Name Amount1 Amount2 样本记录: Id Name Amount1 Amount2 1 aaa 12$ 15£ 2 bbb 30€ 17$ 我不能用一种货币存储值。例如,我想借钱给某人。我将其数据存储在一个表中。货币的类型可能不同。当我

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

例如:

Table A:
-------------
Id
Name
Amount1
Amount2
样本记录:

Id  Name    Amount1 Amount2
1   aaa     12$     15£
2   bbb     30€     17$
我不能用一种货币存储值。例如,我想借钱给某人。我将其数据存储在一个表中。货币的类型可能不同。当我借给某人10欧元时,我应该收回10欧元,我不能像美元那样用一种货币存储所有价值

我想知道在数据库中存储这些值的最佳和更有效的设计是什么。 我应该使用字符串数据类型将金额和货币符号存储在一列中,还是最好将
Money
currency
表定义为用于存储货币值的单独表?
或任何其他设计?

切勿在同一列中存储多个值!! 货币和金额需要分开。另外,如果你有带数字的列名,那么你很可能做错了什么。这是一种方法:

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'

使用适当的索引,查询速度非常快。

永远不要在同一列中存储多个值!! 货币和金额需要分开。另外,如果你有带数字的列名,那么你很可能做错了什么。这是一种方法:

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'

有了适当的索引,查询起来真的很快。

不必对表的实际结构做太多注释(一个表中有两个或更多的钱是可以的,只要它们具有业务意义,如
小计
运费
总计
),我将重点介绍如何存储它们:

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

通货 您通常会处理,每种货币有2个代码:

  • 三字母字母字母代码,如
    EUR
    USD
  • 三位数字代码,如
    978
    840
你用哪一个取决于你自己。您可以使用数字代码为每条记录保存一个字节。另一方面,字母代码对于人类来说更容易阅读和记忆,并且可以更容易地使用定制货币(加密),即可能有事实上的标准字母代码,但没有数字代码

数量 由于货币的小数位数可能不同(欧元、美元等的小数位数为2,
JPY的小数位数为0,
TND的小数位数为3,
TND的小数位数为3,

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

amount INT NOT NULL,
currencyCode CHAR(3) NOT NULL
如果您想存储
12.34美元
,实际上您将存储
(1234,'USD')

多金额、单一货币 如果您的表中有多个始终使用单一货币的金额(如上面的
小计
/
运费
/
总计
示例),则所有3个金额都可以共享单一货币代码:

subtotal INT NOT NULL,
shippingFee INT NOT NULL,
total INT NOT NULL,
currencyCode CHAR(3) NOT NULL
在这种情况下,您可能不需要单独的
小计货币代码
发货费货币代码
总货币代码
,尽管在其他业务案例中,金额将以不同的货币表示。决定权在你

取回钱 当然,处理整数金额不是很容易,所以您需要使用支持从/到小额金额转换的货币库

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

$money=money::of minor(1234,'USD');
$money->getAmount();//12.34
$money->getMinorAmount();//1234

在不对表的实际结构做太多评论的情况下(一个表中有2个或更多的钱是可以的,只要它们具有业务意义,如
小计
运费
总计
),我将重点介绍如何存储它们:

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

通货 您通常会处理,每种货币有2个代码:

  • 三字母字母字母代码,如
    EUR
    USD
  • 三位数字代码,如
    978
    840
你用哪一个取决于你自己。您可以使用数字代码为每条记录保存一个字节。另一方面,字母代码对于人类来说更容易阅读和记忆,并且可以更容易地使用定制货币(加密),即可能有事实上的标准字母代码,但没有数字代码

数量 由于货币的小数位数可能不同(欧元、美元等的小数位数为2,
JPY的小数位数为0,
TND的小数位数为3,
TND的小数位数为3,

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

amount INT NOT NULL,
currencyCode CHAR(3) NOT NULL
如果您想存储
12.34美元
,实际上您将存储
(1234,'USD')

多金额、单一货币 如果您的表中有多个始终使用单一货币的金额(如上面的
小计
/
运费
/
总计
示例),则所有3个金额都可以共享单一货币代码:

subtotal INT NOT NULL,
shippingFee INT NOT NULL,
total INT NOT NULL,
currencyCode CHAR(3) NOT NULL
在这种情况下,您可能不需要单独的
小计货币代码
发货费货币代码
总货币代码
,尽管在其他业务案例中,金额将以不同的货币表示。决定权在你

取回钱 当然,处理整数金额不是很容易,所以您需要使用支持从/到小额金额转换的货币库

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

$money=money::of minor(1234,'USD');
$money->getAmount();//12.34