2009-12-15 70 views
1

考慮一個表,其工作是存儲對象的評級。此處感興趣的列是名爲RATING的列。值來存儲的有效範圍是:SQL:值爲-1,0和1的數據類型選擇

  • -1

在首先想到的是存儲爲 TINYINT smallint。這將存儲 每行只有一個字節 兩個字節。鑑於 tinyint的範圍是0到255 smallint的範圍是-32768到32767,它在這裏適合嗎?還有其他的數據類型更適合嗎?所需的空間對於表&數據庫的預期大小而言是微不足道的。用戶界面將負責確保這三個值將通過枚舉方式進行選擇。

問題:你可以提出一個更小的存儲容量或任何巧妙的設置來存儲這三個值中的一個,而不會犧牲任何的易於理解?

其他注意事項:

  • 存儲空間不是非常大的關注
  • 該值將被累加獲得總評
  • 這可能是微優化的情況下
  • SQL Server 2008

回答

5

smallint是(ahem)最小的teger數據類型,它可以精確地跟蹤-1,0和1.如果空間不是問題,並且您說過它不是,那麼使用smallint。其他任何東西都會過於聰明,需要更多的實施工作。

+0

同意。考慮這些事情是很好的,但除非你的桌子擁有數十億行,否則對超越smallint進行優化是沒有必要的,也可能是有害的。 – Aaronaught 2009-12-15 05:21:53

3

你可以建議一個較小的存儲大小或任何聰明的設置來存儲這三個值之一而不犧牲任何易於理解?

正如你所提到的,當你可以以100美元購買TB級驅動器時,找到最小的數據類型是沒有意義的。

  1. 一個額外的表,叫RATING_CODE,有兩列:

    • RATING_CODE,PK
    • DESCRIPTION
  2. 改變當前表的rating列是rating_code和設置與RATING_CODE表的外鍵關係。

現在很容易理解每​​個評級值的含義,因爲有一個描述要跟着它。這是面向未來的,如果你想添加收視率像馬上要到5或10

3

當你總結一下,這將是最好保持在一列中的數據可用的格式

SELECT SUM(Rating) FROM MYTable ... 

所以,根據其他答案,smallint是你需要的。否則,任何設計出來的解決方案都會使其更難以使用和驗證。

當然,你應該定義一個CHECK CONSTRAINT,以確保你只有-1,0和1的允許

+0

我只是想指出需要檢查約束。 – HLGEM 2009-12-15 16:01:53

3

如果空間真的是一個問題,兩位:

, Sign bit not null 
, StorageVALUE bit not null 
, VALUE AS CASE WHEN Sign = 0 THEN -StorageValue ELSE StorageValue END 
+0

這是一個字節... – gbn 2009-12-15 06:33:45

+2

如果你打算走這條路線,爲什麼不用一個可空的位,null用於-1? – RickNZ 2009-12-15 14:21:55