Php 在交易分类账表中存储有符号或无符号值

Php 在交易分类账表中存储有符号或无符号值,php,mysql,unsigned,signed,Php,Mysql,Unsigned,Signed,想象一个事务表 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; 现在,

想象一个事务表

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`;
现在想象一个签名的
金额

SELECT SUM(`amount`) AS `total` FROM `transaction` GROUP BY `currency`;
看起来更简单,对吧?但不知何故,我觉得我遗漏了一些东西,以后事情可能会变得复杂,特别是如果我以后需要用PHP处理数据的话


如果您对使用有符号和无符号数字的利弊有任何评论,我将不胜感激。

使用无符号值最初允许您在不需要负值的情况下在同一空间中存储较大的值(~2X)

对于您的情况,我将删除十进制列上的无符号,并按其应有的方式表示值。在查询中进行示例中所示的数学运算将影响性能,对于大型查询可能会有显著影响

不使用限定符表示数据几乎总是更好的,但实际上是这样。想象一下,如果有一天您还必须添加货币兑换,会对性能产生什么影响


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

使用未签名的值最初允许您在不需要负值的情况下在同一空间中存储较大的值(~2倍)

对于您的情况,我将删除十进制列上的无符号,并按其应有的方式表示值。在查询中进行示例中所示的数学运算将影响性能,对于大型查询可能会有显著影响

不使用限定符表示数据几乎总是更好的,但实际上是这样。想象一下,如果有一天您还必须添加货币兑换,会对性能产生什么影响


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

@mkaatman此问题在那边不合适,请参阅。请不要推荐你不熟悉的网站(你甚至把网站的名字弄错了),只要稍加修改,问题就可以被接受。谢谢你的建议。@mkaatman基本上我想知道,如果我遗漏了一点,可能会使这个或那个模式变得复杂。要我删除“赞成和反对”这句话吗?@mkaatman这个问题不太合适,看。请不要推荐你不熟悉的网站(你甚至把网站的名字弄错了),只要稍加修改,问题就可以被接受。谢谢你的建议。@mkaatman基本上我想知道,如果我遗漏了一点,可能会使这个或那个模式变得复杂。我是否应该删除“赞成和反对”这句话?您所说的“增加货币兑换”是什么意思?这会对绩效产生怎样的影响?你是说“没有限定符的数据”我应该删除“买入”和“卖出”,只用符号(+/-)来表示变量的类型吗?我用“添加货币转换”作为未来需要的例子,需要对“真实”值进行数学运算。通过“无限定符的数据”,是的,我不会使用另一个字段来表示值的符号。您可能仍然使用买卖价值来表示交易类型,但不使用价值符号。您所说的“添加货币转换”是什么意思?这对性能有何影响?你是说“没有限定符的数据”我应该删除“买入”和“卖出”,只用符号(+/-)来表示变量的类型吗?我用“添加货币转换”作为未来需要的例子,需要对“真实”值进行数学运算。通过“无限定符的数据”,是的,我不会使用另一个字段来表示值的符号。您可能仍然使用买卖价值来表示交易类型,但不使用价值符号。