관계형 데이터베이스에서 열거 형을 어떻게 표현해야합니까?


12

회사에서 작업중인 장치에서 발생하는 트랜잭션을 추적하는 관계형 데이터베이스를 개발 중입니다. 장치에서 발생할 수있는 여러 유형의 트랜잭션이 있으므로 기본 레코드 테이블 중 하나에 "trans_type"필드가 있습니다. 우리 그룹은이 필드의 유형을 정수로 만들고 열거 된 유형으로 취급하기로 결정했습니다. 내 직감에 따르면 데이터베이스 데이터를보다 읽기 쉽고 사용하기 쉽도록이 필드를 문자열로 만드는 것이 더 좋습니다. 동료들은 이것이 가치보다 더 많은 문제를 일으킬 것이라고 걱정하는 것 같습니다. 그 문자열 비교는 너무 비싸고 오타의 가능성은 너무 큰 장벽입니다.

따라서 본질적으로 열거 된 값인 관계형 데이터베이스의 필드를 처리 할 때이 필드를 정수 또는 문자열로 만드는 것이 더 나은 디자인 결정입니까? 아니면 내가 간과 한 다른 대안이 있습니까?

참고 : 명시 적 열거 유형은 사용중인 데이터베이스에서 지원되지 않습니다. 이 데이터베이스와 인터페이스 할 개발중인 소프트웨어는 C ++로 작성되었습니다.


create table에서 검사 된 유형 정의로 만들기 위해 기한이 지난 사람에게 경고합니까? CREATE TABLE hit (ip varchar (40), ip_class ENUM (0, "IPv4", 1, "IPv6")); 서수 또는 문자열 (서수에 매핑되는)로 = <및>를 확인할 수 있어야합니다.
dlamblin

답변:


26

열거 유형은 데이터베이스에서 ID 번호와 문자열 이름 및 유용하다고 생각되는 다른 열이있는 별도의 테이블이어야합니다. 그런 다음 각 유형이이 테이블에 행으로 존재합니다. 그런 다음 테이블에서 트랜잭션을 기록하고 있습니다. "trans_Type"필드는 해당 참조 테이블의 키에 대한 외래 키 여야합니다. 이것은 데이터베이스 정규화의 표준 사례입니다.

이렇게하면 하나의 공식 이름 문자열을 저장하고 성능을 위해 숫자 비교를 사용하며 모든 트랜잭션에 유효한 유형이 있다는 참조 무결성이 있습니다.


1
예. 'O'를 '열기'로 변경하려면 한 행만 변경하면됩니다.
Daniel Kaplan

+1. 관계형 DB에서 열거 형을 나타내는 가장 좋은 방법은 간단한 int / string 테이블입니다.
mike30

아마, 자바 솔루션을 찾고 다음 방문자가 찾을 것이 유용
Jauhien

2
이. 추가 크레딧을 위해 개발자 팀이 Java / C # 열거 형 또는 이와 유사한 형식으로 정수를 정의한 경우 코드 열거 형 정의가 조회 테이블에서 분기되었는지 확인하는 테스트를 작성할 수 있습니다. 순서에 맞지 않는 요소를 추가하면 동기화되지 않을 수 있으며 라이브 데이터 레코드가 잘못 표시 될 때까지 인식하지 못할 위험이 항상 있습니다.
Julia Hayward

4

일반적인 방법은 trans_types테이블을 만든 다음 기본 테이블이 외래 키라는 테이블을 참조하도록하는 것입니다 trans_type_id. 이렇게하면 레코드가 유효한 열거 유형 만 참조하게됩니다.

예:

trans_type
----------
  신분증
  이름

업무
------------
  신분증
  trans_date
  세부
  trans_type_id (FK에서 trans_type.id로)

데이터 예 :

trans_type

아이디 | 이름
----------
1 | 제출
2 | 취소


업무

아이디 | trans_date | trans_type_id
---------------------------------
1 | 2012-12-31 | 1
2 | 2013-01-09 | 2

3

값이 정수로 데이터베이스에 들어 오면 해당 방식으로 저장하십시오. 데이터베이스에 쓰는 동안 오버 헤드를 문자열로 변환 할 필요가 없습니다. 문자열 / 텍스트 값이있는 조회 테이블과 항상 관련 될 수 있습니다 (표준화 됨).

이것은 일종의 업데이트 루틴을 실행하는 대신 단일 위치에서 문자열 값을 업데이트하는 이점이 있습니다. 1 = '빨간색'대신 '진짜 빨간색'과 같을 수 있음

이는 문자열 값이있는 테이블 하나만 필요 (비정규 화)에 비해 성능보고에 적합하지 않습니다. 이 필드의 색인은 성능을 충분히 향상시킵니다.

대부분의 RDBMS는 충분한 마력을 허용합니다. 일반 데이터 형식으로 테이블을 '읽을'수 있다는 아이디어는 있지만 테이블을 조인하는 것이 중요하지 않습니다. 보기 나 비슷한 물체를 사용하는 습관을 들일 것.


2

별도의 열거 테이블 접근 방식을 옹호하는이 질문에 대한 다른 답변에 동의하지 않아야합니다.

그러나 이미 언급 한 내용을 반복하지 않는 것이 좋습니다. 따라서 Stack Overflow에서 동일한 질문에 대한 대답을 간단히 참조 할 것입니다 : https : //.com/a/229919 / 114626


링크 된 답변에 +1 이 질문에 대한 귀하의 답변은 정답입니다. 그러나 질문자가 열거 형에서 유연성을 원한다면 참조 테이블이 훨씬 좋습니다.
Harke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.