2011-09-17 3 views
0

각자 고유 한 ID 개체 목록이 있으며 데이터베이스에 대한 테이블을 만들어야합니다. 고유 한 ID를 테이블의 기본 키로 사용하는 것이 좋지만 한 가지 문제점이 있습니다. 모든 ID는 하나의 객체를 제외하고는 정수입니다. id는 140, 141, 142.1, 142.2, 143... 이므로 ID는 142.1142.2 인 2 개의 하위 객체가 있습니다. 이제 기본 키의 유형으로 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을 저장할 수 있지만 1234 또는 12.345은 저장할 수 없습니다.

또 다른 옵션은 두 개의 정수 n1, n2위한 복합 기본 키 :

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

int는 4 바이트가 아닌 두, 그래서 두 배의 크기 차이는 그렇게 크지 않다.

그러나 부동 소수점 숫자는 정확한 값으로 저장되지 않으므로 근사값으로 사용하면 안됩니다.

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]' 
      ) 
);