Oracle를 오래 사용하다 PostgreSQL 사용하면서 접한 데이타 타입이 있어 한번 알아보았다.

 

PostgreSQL에서 ENUM 타입은 사전에 정의된 특정 값들만 포함할 수 있는 데이터 타입으로 미리 지정된 값의 목록 중에서만 값을 가질 수 있는 필드를 정의할 때 유용하다.

예를 들어, 'small', 'medium', 'large'라는 세 가지 사이즈만을 허용하는 'shirt_size'라는 ENUM 타입을 생성할 수 있다.

 

CREATE TYPE dress_size AS ENUM ('small', 'medium', 'large');

 

이렇게 생성한 'dress_size' ENUM 타입은 이제 테이블의 컬럼 타입으로 사용할 수 있다.

예를 들어, 'dress'라는 테이블에 'size'라는 컬럼을 추가하고, 이 컬럼의 타입을 'dress_size'로 지정하려면 다음과 같은 SQL 문을 사용한다.

CREATE TABLE shirts (
    name text,
    size shirt_size
);

이제 'size' 컬럼에는 'small', 'medium', 'large' 중 하나의 값만을 저장할 수 있다.

ENUM 타입은 데이터 무결성을 강화하는 데 도움이 된다.

특정 필드가 지정된 값들 중에서만 값을 가질 수 있도록 제한하면, 잘못된 값이나 예상치 못한 값이 그 필드에 저장되는 것을 막을 수 있다.

그러나 ENUM 타입은 유연성이 상당히 떨어진다.

새로운 값이 필요하게 되면 ENUM 타입을 변경해야 하고, 이는 기존의 데이터와의 호환성 문제를 일으킬 수 있다.

따라서 ENUM 타입은 가능한 값의 범위가 잘 정의되어 있고, 미래에 변경될 가능성이 낮은 경우에만 사용하는 것이 좋다.

 

장단점을 한번 보자.

장점

  • 데이터 무결성 
    ENUM 타입을 사용하면 컬럼이 허용하는 값의 범위를 제한할 수 있다.
    이를 통해 잘못된 값이나 예상치 못한 값이 해당 컬럼에 저장되는 것을 방지하고, 데이터의 무결성을 유지할 수 있습니다.

  • 명확성 
    ENUM 값들은 사전에 정의되므로, 어떤 값들이 해당 컬럼에 들어갈 수 있는지 명확하게 알 수 있다.

  • 효율성
    ENUM 타입은 내부적으로 정수로 저장되므로, 문자열을 저장하는 것보다 저장 공간을 덜 사용하고 조회 속도도 빠를 수 있다.

단점 

  • 유연성 부족
    ENUM 타입의 값은 사전에 정의되어야 합다. 새로운 값이 필요하게 되면 ENUM 타입을 수정해야 하고, 이는 복잡하고 시간이 많이 걸릴 수 있다. 또한 이런 변경이 기존 데이터와의 호환성 문제를 일으킬 수 있다.

  • 이식성
    ENUM 타입은 PostgreSQL과 같은 일부 데이터베이스 시스템에서만 지원된다.
    만약 데이터베이스 시스템을 변경하게 될 경우, ENUM 타입을 다른 형식으로 변환해야 할 수도 있다.

  • 쿼리 복잡성
    ENUM 타입의 값을 변경하거나 쿼리하는 데는 특수한 SQL 문법이 필요하며, 이는 SQL 작성을 복잡하게 만들 수 있다.

 

따라서, ENUM 타입은 가능한 값의 범위가 잘 정의되어 있고, 미래에 변경될 가능성이 낮은 경우에만 사용하는 것이 좋다.

가능한 값의 범위가 빈번하게 변경되거나, 다른 데이터베이스 시스템과의 호환성이 중요한 경우에는 다른 방식으로 데이터 무결성을 유지하는 것이 좋을 수 있다.

예를 들어, 테이블을 사용하여 허용되는 값들을 관리하고, 외래 키 제약 조건을 사용하여 데이터 무결성을 유지할 수 있다.

 

 

성능은 얼마나 차이가 날까?

 

  • 저장 공간
    ENUM 타입의 값들은 내부적으로 작은 정수로 저장되므로, 실제로는 문자열 값보다 적은 저장 공간을 사용합다. 이는 저장 공간의 효율성을 높일 수 있다.

  • 성능
    ENUM 타입은 비교 연산이 매우 빠르다는 장점이 있다.
    ENUM 값들은 내부적으로 정수로 저장되므로, ENUM 값들을 비교할 때는 실제로 정수를 비교하는 것과 같다.
    이는 문자열 값을 비교하는 것보다 훨씬 빠르며, 이로 인해 쿼리의 성능이 향상될 수 있다.

  • 인덱싱
    ENUM 타입의 컬럼은 인덱싱에 잘 동작다.
    인덱스는 컬럼의 값을 효율적으로 정렬하고, 쿼리에서 빠르게 값을 찾을 수 있도록 돕는다.
    ENUM 타입의 컬럼에 인덱스를 생성하면, 해당 컬럼에서 값을 찾는 쿼리의 성능이 향상될 수 있다.

 

하지만 ENUM 타입의 단점 중 하나인 새로운 값을 추가하거나 기존 값을 변경하려면 ENUM 타입을 수정해야 한다는 것이 좀 크다.

이 과정에서 데이터베이스를 잠그거나 성능을 저하시킬 수 있어 ENUM 타입은 가능한 값의 범위가 잘 알려져 있고 빈번하게 변경되지 않는 경우에만 사용하는 것이 좋을거 같다.

 

나중에 시간나면 enum과 varchar를 ㅂ비교하면 플랜을 한번 봐야겠다.

+ Recent posts