繁体   English   中英

这种 SQL 表设计对于数量有限的货币是否有意义?

[英]Does this SQL Table design make sense for a Currency with a finite amount?

这是我在 StackOverFlow 上的第一篇文章。 我需要一些意见,我的表格设计对于用户可以拥有货币并且该货币数量有限的系统是否有意义——比如电子商务中的加密货币或折扣硬币。

这是一个例子。 有一种货币说“硬币”(CurrencyName),最大数量为“1,000”(TotalSupply)。 系统中的每个用户都可以拥有一个,因此我创建了一个引用用户 ID 和货币 ID 的库存表,并添加了 Amounts Owned 列。 是否有意义?

用户表

  • 用户 ID INT PK
  • Email VARCHAR(255)
  • 密码 VARCHAR(255)
  • 注册日期 DATETIME

货币表

  • CurrencyId INT PK
  • 货币名称 VARCHAR(255)
  • TotalSupply INT

库存表

  • CurrencyId INT FK
  • UserId INT FK
  • AmountOwned INT

如果您的货币中没有小数(“美分”或“便士”),这看起来是一个很好的表格设置。 无法控制所有用户拥有的总数不会超过TotalSupply

一个很好的提示是使用类似total_owned而不是TotalOwned的名称。

如果您决定要使用较小的单位(“ cent ”),请使用DECIMAL类型, FLOAT会带来舍入问题。

假设加密货币保留到小数点后 18 位,这些似乎是 MySQL 中唯一的“好”数据类型选择:

BIGINT UNSIGNED  -- scaled so that 1e18 in that is your 1.0
DECIMAL(19,18)   -- handles any amount up to (and slightly beyond 1.0)

可能不值得使用 Trigger 或 Check 来验证值是否超过最大值,或者是否为负值。

第一个选项占用 8 个字节,加上缩放代码。 第二个占用 9 个字节并直接处理诸如“0.00000123”之类的东西(不缩放)。 两者都没有舍入错误(假设您坚持 18 位数字。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM