Представьте себе таблицу транзакций ..
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.
Я был бы очень признателен за любые комментарии о плюсах и минусах, используя подписанные и неподписанные числа.
Использование значения без знака изначально позволяло хранить большие значения (примерно в 2 раза больше) в одном и том же пространстве в тех случаях, когда вам не нужны отрицательные значения.
В вашей ситуации я бы отбросил беззнаковый десятичный столбец и представлял значения, какими они должны быть. Выполнение математических операций в ваших запросах, как в примере, повлияет на производительность, возможно, значительно для больших запросов.
Почти всегда лучше представлять данные без классификаторов, но в действительности. Представьте себе влияние на производительность, если в один прекрасный день вам придется добавить конвертацию валюты.
И, наконец, с вашей текущей реализацией, как бы вы представляли кредит против дебета? Например, если при продаже есть возврат, у вас нет возможности сохранить транзакцию «не продавать».
Других решений пока нет …