【问题标题】:Storing signed or unsigned value in a transaction ledger table在交易分类帐表中存储签名或未签名的值
【发布时间】:2017-08-17 23:29:37
【问题描述】:

想象一个事务表..

CREATE TABLE `transaction` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `type` ENUM('buy','sell') NOT NULL,
    `amount` DECIMAL(10,2) UNSIGNED NOT NULL,
    `currency` ENUM('eur','usd') NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE = InnoDB;

现在,如果我需要汇总所有条目并返回一个总数,我会执行以下操作

SELECT SUM(
    CASE
        WHEN `type` = 'buy' THEN `amount` ELSE -`amount`
    END) AS `total`,
    `currency`
  FROM `transaction`
GROUP BY `currency`;

现在想象一个SIGNED amount

SELECT SUM(`amount`) AS `total` FROM `transaction` GROUP BY `currency`;

看起来更简单,对吧?但不知何故,我觉得我遗漏了一些东西,以后事情可能会变得复杂,特别是如果我以后需要用 PHP 处理数据时。

我非常感谢任何使用有符号和无符号数字的 cmet 利弊。

【问题讨论】:

  • @mkaatman 这个问题在那边不太合适,请参阅What is the problem with "Pros and Cons"?。请不要推荐您不熟悉的网站(甚至网站名称错误)
  • 稍微改写一下这个问题就可以接受了。感谢您的建议。
  • @mkaatman 基本上我想知道,如果我错过了可能使这个或那个模式变得复杂的一点。我应该删除“利弊”这句话吗?

标签: php mysql unsigned signed


【解决方案1】:

在不需要负值的情况下,使用无符号值最初允许您在相同空间中存储更大的值(大约 2 倍)。

对于您的情况,我会将 unsigned 放在小数列上,并按应有的方式表示值。像示例中那样在查询中进行数学运算会影响性能,对于大型查询可能会显着影响。

在没有限定符的情况下表示数据几乎总是更好,但实际上是这样。想象一下如果有一天您还必须添加货币换算对性能的影响。

最后,在您当前的实施中,您如何表示贷方与借方?例如,如果有销售退款,您就无法存储“取消销售”交易。

【讨论】:

  • “添加货币换算”是什么意思,这对性能有何影响?您的意思是“没有限定符的数据”我应该删除“买入”和“卖出”并仅用符号 (+/-) 表示变量的类型?
  • 通过“添加货币转换”,我将其用作未来需要对“真实”价值进行数学计算的示例。通过“没有限定符的数据”,是的,我不会使用另一个字段来指示值的符号。您可能仍会使用买入和卖出值来指示交易类型,而不是值的符号。
猜你喜欢
  • 2021-12-25
  • 2022-08-13
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
相关资源
最近更新 更多