유형 필드의 INT 또는 CHAR


19

테이블, 또는 Type필드에 가장 적합한 디자인은 무엇입니까 ? 다시 말해,이 스키마가 주어지면 :intchar(1)

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehType .... not null
)

하기에보다 효율적으로 (현명한 성능)가 VehType할 수 int또는은 char(1)? 5 가지 유형의 자동차가 있다고 가정합니다. 증가 값 0-> 4 또는 유형의 문자 (예 : 'v', 's', 'c', 't', 'm')를 사용해야합니까?

그 이상이면 별도의 Type 테이블을 사용하고 외래 키 관계를 갖지만 그 필요성이 보이지 않습니다.

나는 것을 알 수 sys.objects카탈로그 뷰는위한 문자 사용 type필드. 그 이유가 있습니까? 나는 단지 여기에서 얇은 공기를 움켜 쥐고 있는가?

답변:


20

일반적으로 1 바이트 인 tinyint를 사용합니다.

  • 사용하여 데이터 정렬을 비교하기 때문에 char (1)이 약간 느려집니다.

  • 혼란 : S : SUV 또는 Saloon 또는 Sedan 또는 Sports는 무엇입니까?

  • 문자를 사용하면 더 많은 유형을 추가 할 때 제한됩니다. 마지막 요점을 참조하십시오.

  • 내가 본 모든 시스템에는보고와 같은 하나 이상의 클라이언트가 있습니다. V, S를 "Van", "SUV"등으로 변경하는 논리는 반복해야합니다. 룩업 테이블을 사용한다는 것은 간단한 가입입니다.

  • 확장 성 : 룩업 테이블에 하나의 행을 추가하거나 많은 코드와 제약 조건을 변경할 수있는 하나 이상의 유형 ( " Flying Car "의 경우 "F")을 추가하십시오 . 그리고 클라이언트 코드도 V, S, F 등이 무엇인지 알아야하기 때문에

  • 유지 관리 : 논리는 데이터베이스 제약 조건, 데이터베이스 코드 및 클라이언트 코드의 세 위치에 있습니다. 조회 및 외래 키를 사용하면 한 곳에있을 수 있습니다.

하나의 문자를 사용하는 것의 장점은 무엇입니까?

참고 : Enums에 대한 관련 MySQL 질문이 있습니다. 룩업 테이블도 사용하는 것이 좋습니다.


2
좋은 점. 왜 다른 사람들이 sys.objects와 같은 char (1)을 사용하는지 궁금해합니다.
토마스 스트링거

2
sys.objects는 Sybase 및 이전 버전의 SQL Server로 돌아가는 레거시를 가지고 있습니다. en.wikipedia.org/wiki/Microsoft_SQL_Server#Genesis 시스템 개체를 살펴보면 새 DMV에서 ID가 아닌 코드가 모두 표시됩니다. MS 이외의 다른 사람은? OO / Enum이 아닌 RDBMS를 생각하고 Lookups를 사용하는 것이 좋습니다.
gbn

1
그래 나 동의 해. 명확하게 해주셔서 감사합니다. 관계형 무결성 및 조회 테이블을 사용하여 실제 오버 엔지니어링이 없다는 것은 매우 정확한 진술입니까? 이 경우 조회 테이블에 소수의 레코드를 저장하고 소비 테이블에서 참조하는 경우 이전 명령문이 정확합니까?
Thomas Stringer

1
@onedaywhen : 다른 유형을 데이터 또는 변경되지 않는 정적 값 세트로 볼 때 차이가납니다. 유형 테이블을 사용하는 경우 데이터베이스 및 애플리케이션에서 비즈니스 규칙을 변경할 필요없이 테이블에 다른 유형을 추가 할 수 있습니다.
Guffa

1
@ MichaelKjörling : 수정, 그것은 있다면 단지 의 핵심. 그러나 OP는 "v"또는 "s"와 같은 것을 의미합니다. 우리는 통화 코드 (EUR, USD, GBP, CHF 등)와 같은 자체 설명 및 완전한 자연 키에 관한 것이 아닙니다.
gbn

3

위대한 gbn의 답변을 보완하는 것과 같습니다 .

아마도 당신은 그런 것을 만들 수 있습니다 :

create table dbo.VehicleType
(
    VehicleTypeId int not null primary key,
    Name varchar(50) not null,
    Code char(3) null
) 
go 

create table Car
(
    Name varchar(100) not null,
    Description varchar(100) not null,
    VehTypeId int not null ,
    foreign key FKTypeOfCar(VehTypeId) referenctes dbo.VehicleType (VehicleTypeId) 
)
go 

따라서 관계형 무결성을 유지하면서 외래 키를 사용하여 열거 형으로 원하는대로 할 수 있습니다. 으로 code는 데이터베이스에 기록 될 수 있도록 열 당신이 마음대로 당신의 문자 코드를 사용할 수 있습니다 (그리고 당신은 시스템 통합을위한 응용 프로그램 코드에 복잡한 변환하지 않고, DB에서 직접 코드 정보를 추출 할 수 있습니다).


null코드 를 허용 하시겠습니까?
Jack Douglas

예, 아직 코드화되지 않은 차량 유형을 나타내는 코드는 선택 사항입니다.
Fabricio Araujo

사람들이 댓글 삭제를 유지하는 이유는 무엇입니까? 꽤 성가시다.
Fabricio Araujo

@FabricioAraujo-주석이 더 이상 사용되지 않는 경우 (예 : "응답에이를 편집하고 실제로 그렇게합니다") 더 이상 적용되지 않는 주석을 정리하는 것이 좋습니다.
Nick Chammas

1
유형 테이블에 "분류되지 않은"유형을 추가하고 외래 키 필드에 null 값을 허용하는 대신 VehTypeId 필드의 기본값을 분류되지 않은 값으로 만드는 것이 좋습니다. "null"이 유효한 비즈니스 의미를 갖도록하는 것은 일반적으로 나쁜 습관입니다.
Michael Blackburn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.