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


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.