2017-03-24 51 views
1

試想一個交易表..存儲簽名或在交易底賬表無符號值

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`; 

現在想象一下SIGNEDamount

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

似乎更簡單吧?但不知何故,我覺得我錯過了一些東西,事情可能會變得更復雜,特別是如果我以後需要使用PHP處理數據。

我非常感謝任何關於使用簽名和未簽名數字的利弊評論。

+0

@mkaatman這個問題在這裏不太合適,請參閱[優點和缺點]?(https://softwareengineering.meta.stackexchange.com/q/6758/31260)有什麼問題。請放棄推薦您不熟悉的網站(您甚至得到了網站名稱錯誤) – gnat

+0

只需稍作重新說明,問題就可以被接受。感謝您的建議。 – mkaatman

+0

@mkaatman基本上我想知道,如果我錯過了一點可以使這個或那個模式變得複雜的事情。我應該刪除「利弊」一句話嗎? – Aley

回答

0

在不需要負值的情況下,使用無符號值最初允許您在相同的空間中存儲較大的值(大約2倍)。

對於你的情況,我會放棄在小數點列上的無符號數,並且表示它們應該是的值。在示例中進行查詢中的數學運算會影響性能,對於大型查詢可能會有很大影響。

在沒有限定符的情況下表示數據幾乎總是比較好,但實際上卻是如此。想象一下,如果有一天您還需要添加貨幣轉換,則會對性能產生影響。

最後,在您目前的實施情況下,您如何表示貸記與借記?例如,如果銷售有退款,則無法存儲「未出售」交易。

+0

「增加貨幣換算」是什麼意思?這將如何影響業績?你的意思是「沒有限定符的數據」,我應該刪除「購買」和「出售」,並且僅通過符號(+/-)來表示變量的類型? – Aley

+0

通過「添加貨幣換算」我用它作爲未來需求的一個例子,需要對「真實」價值進行數學計算。通過「沒有限定符的數據」,是的,我不會使用另一個字段來表示值的符號。您仍然可以使用買入和賣出價值來指示交易類型,但不是價值的符號。 –