我有一個對象的列表,每個它自己的ID,我需要在數據庫中爲他們創建一個表。使用它們的ID(因爲它們是唯一的)作爲表中的主鍵是一個好主意,但有一個問題。所有的ID都是整數,除了一個對象 - 它有2個ID爲142.1
和142.2
的子對象,所以ID列表是140, 141, 142.1, 142.2, 143...
現在,如果我選擇double作爲主鍵類型,那麼它將存儲不必要的6個字節(因爲double是8字節和INT
是2)只支持兩個雙數,我不能選擇INT
。那麼,如果我不能更改對象列表,應該使用哪種類型?SQLServer選擇主鍵類型
0
A
回答
2
double
的數學方法是imprecise,您不應將其用於金錢或對象ID之類的離散數字。考慮使用decimal(p,s)
代替。其中p
是位數的總數,s
是該點後面的位數。例如,decimal(5,2)
可以存儲123.45
,但不可以存儲1234
或12.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]'
)
);
相關問題
- 1. 選擇主鍵數據類型numeric(18,0)
- 2. 選擇主鍵
- 3. 選擇主鍵
- 4. 錯誤:選擇不包含主類型
- 5. 在cassandra中選擇組合類型鍵
- 6. 主鍵選擇的性能
- 7. 類型選擇
- 8. 主鍵類型:int vs long
- 9. Hibernate/JPA SQLServer主鍵自動增量
- 10. SQLServer 2008通用列類型
- 11. 使用沒有主鍵的主鍵選擇語句
- 12. SQL Server從表中選擇主鍵包含多列的主鍵
- 13. Cassandra VS Dynamo數據庫主鍵選擇
- 14. 從表中選擇複合主鍵
- 15. SQL Server - 爲我的表選擇主鍵
- 16. 爲許多關係選擇主鍵
- 17. 與主鍵字段中選擇行= NULL
- 18. SQL - 從子查詢中選擇主鍵
- 19. SQLite插入或選擇主鍵
- 20. 主鍵select從清單中選擇
- 21. 如何選擇我的主鍵?
- 22. 如何選擇的第二主鍵
- 23. 爲性能選擇索引和主鍵
- 24. MySQL的:選擇行兩三個主鍵
- 25. 最好的選擇來管理大型數據集SQLSERVER
- 26. REST - 內容類型選擇
- 27. Select2類型來選擇
- 28. 選擇數據庫類型
- 29. Qt數據類型選擇
- 30. CSS - 類型選擇標籤?
不是一個好主意。你不應該把邏輯放入主鍵。您應該將有關子對象的信息放入單獨的列中。 –
'int'是4個字節不是2.('smallint'雖然是2) –
我知道,但我現在不能改變任何東西,我需要用我所擁有的解決這個問題。 – Sergey