Сохранение значения со знаком или без знака в таблице книги транзакций

Представьте себе таблицу транзакций ..

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.

Я был бы очень признателен за любые комментарии о плюсах и минусах, используя подписанные и неподписанные числа.

1

Решение

Использование значения без знака изначально позволяло хранить большие значения (примерно в 2 раза больше) в одном и том же пространстве в тех случаях, когда вам не нужны отрицательные значения.

В вашей ситуации я бы отбросил беззнаковый десятичный столбец и представлял значения, какими они должны быть. Выполнение математических операций в ваших запросах, как в примере, повлияет на производительность, возможно, значительно для больших запросов.

Почти всегда лучше представлять данные без классификаторов, но в действительности. Представьте себе влияние на производительность, если в один прекрасный день вам придется добавить конвертацию валюты.

И, наконец, с вашей текущей реализацией, как бы вы представляли кредит против дебета? Например, если при продаже есть возврат, у вас нет возможности сохранить транзакцию «не продавать».

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]