유형 필드의 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.