我有一个对象列表,每个对象都有自己的id,我需要在数据库中为它们创建一个表。使用它们的ID(因为它们是唯一的)作为表中的主键是个好主意,但是有一个问题。除了一个对象外,所有id都是整数 - 它有2个带有id 142.1
和142.2
的子对象,因此id列表为140, 141, 142.1, 142.2, 143...
现在,如果我选择double作为主键类型,那么它将存储不必要的6个字节(因为double是8个字节而INT
是2)只支持两个双数,我不能选择{{1} }。那么如果我不能改变对象列表,我应该使用什么类型?
答案 0 :(得分: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 :(得分:1)
int
是四个字节,而不是两个字节,因此与double的大小差异不是很大。
但是,您绝对不应该使用浮点数作为键,因为浮点数不会存储为精确值,而是作为近似值。
您可以使用decimal
和一个小数位(如decimal(5,1)
)来存储类似的值。 decimal
是固定点数,因此它存储为精确值,而不是近似值。
答案 2 :(得分: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]'
)
);