2011-09-17 102 views
0

我有一個對象的列表,每個它自己的ID,我需要在數據庫中爲他們創建一個表。使用它們的ID(因爲它們是唯一的)作爲表中的主鍵是一個好主意,但有一個問題。所有的ID都是整數,除了一個對象 - 它有2個ID爲142.1142.2的子對象,所以ID列表是140, 141, 142.1, 142.2, 143... 現在,如果我選擇double作爲主鍵類型,那麼它將存儲不必要的6個字節(因爲double是8字節和INT是2)只支持兩個雙數,我不能選擇INT。那麼,如果我不能更改對象列表,應該使用哪種類型?SQLServer選擇主鍵類型

+3

不是一個好主意。你不應該把邏輯放入主鍵。您應該將有關子對象的信息放入單獨的列中。 –

+1

'int'是4個字節不是2.('smallint'雖然是2) –

+0

我知道,但我現在不能改變任何東西,我需要用我所擁有的解決這個問題。 – Sergey

回答

2

double的數學方法是imprecise,您不應將其用於金錢或對象ID之類的離散數字。考慮使用decimal(p,s)代替。其中p是位數的總數,s是該點後面的位數。例如,decimal(5,2)可以存儲123.45,但不可以存儲123412.345

另一選擇是兩個整數n1, n2複合主鍵:

alter table YourTable add constraint PK_YourTable primary key (n1, n2) 
1
一種

int四個字節,而不是兩個,所以尺寸差爲雙沒那麼大。

但是,您絕對不應該使用浮點數作爲鍵,因爲浮點數不是作爲精確值存儲的,而是作爲近似值存儲的。

您可以使用帶有一個小數位的decimal(如decimal(5,1))來存儲這樣的值。 A decimal是一個固定點數,所以它被存儲爲一個確切的值,而不是一個近似值。

1

選擇合適長度的VARCHAR,並使用CHECK約束來確保數據符合您的域規則,例如,根據您發佈的小樣本數據:

CREATE TABLE Ids 
(
id VARCHAR(5) NOT NULL UNIQUE 
    CONSTRAINT id__pattern 
     CHECK (
       id LIKE '[0-9][0-9][0-9]' 
       OR id LIKE '[0-9][0-9][0-9].[1-9]' 
      ) 
);