flag enum 데이터 베이스 저장하는 방법

아래와 같은 c# enum 이 있습니다.

[Flags]
enum Movement
{
    Walk =    0b0000_0001;
    Run =     0b0000_0010;
    Sit =     0b0000_0100;
    Turn =    0b0000_1000;
    // 확장 예정
    // Jump = 0b0001_0000;
    // Hop =  0b0010_0000;
    // Crawl= 0b0100_0000;
}

이러한 자료형을 데이터 베이스에 저장하는 실무적인 방법이나, 혹은 가장 잘 대변하는 데이터 베이스 자료형은 무엇인지 조언 부탁드립니다.

선정한 데이터베이스는 PostgresQL 입니다만, 꼭 이 제품에 한정하지 않아도 될 것 같습니다.

전문가 분들의 고견 부탁드립니다.

참고로, ORM은 Dapper 를 사용할 예정입니다.

3개의 좋아요

보통 EnumStringConverter 같은 직렬화로 하지 않을까요?

3개의 좋아요

그 방법은 불필요한 중복 저장이 많을 것 같아 채택하지 않으려는 방법입니다.
(제 판단에 그러하는 의미입니다. 맞다, 틀리다가 아니구요)

movement
-------------
Walk
WalkRunSit
WalkTurn
WalkRunSitTurn

movements 테이블을 만들어보려고도 했으나, 확장은 30개 이내에서 충분히 커버가 되는 값이라, 불필요한 join 이 호출되서, 그것도 채택하기 고민스럽구요.

현재는 일단 int 형식의 필드로 저장하고 있는데, 실무적으로는 어떻게들 하시는지 궁금해서 질문했습니다.

3개의 좋아요

비트마스크로 조합되는 값이면 int형으로 저장하는 게 맞겠죠

6개의 좋아요

flag의 개별 상태가 빈번하게 where 절에 쓰인다면 테이블의 개별 컬럼으로 각 상태를 bool로 두는 것이 나쁘지 않다고 생각합니다. 다만 상태가 빈번하게 추가될 것이 예상된다면 그냥 smallint로 저장하는 것이 좋을 것 같습니다.

4개의 좋아요

현재 구현 상, 코드의 조건절에는 수도없이 들어가지만, 쿼리에는 안씁니다.
그러나, 나중에는 어떻게 될지 모르겠습니다.

3개의 좋아요

만약 해당 값이 빈번하게 업데이트 되는 컬럼 이라면 KeyValue 형태의 테이블 작성을 고려해 보셔도 좋을 것 같습니다.

Master (1) - State (N)

만약, 하나의 ROW로 처리한다면 반드시 병목 발생할 겁니다.

4개의 좋아요

대부분 초기값에서 변화가 없고, 극히 예외적 - 1년에 한번 있을까 말까 - 으로 변경됩니다.

KeyValue 테이블이라면, movements 테이블을 만들고, 다른 테이블에서 foreign key로 참조하라는 의미인가요?

3개의 좋아요

movements 테이블을 KeyValue 테이블 형태로 생성하고
movements 테이블을 참조하는 테이블에 Foreign key로 참조하는 방향입니다.

[Table]
Chracters (1) - (N) Movements
ID (int) - Work (bit)
- RUN (bit)
SIT (bit)
TURN (bit)

입력하시는 데이터가 테이블에 UPDATE가 빈번할 경우 별도의 테이블로 분리해야 합니다.

Chracters 라는 테이블에 같이 만들 경우 Row Lock에 의한 병목이 발생할 수 있습니다.

따라서 분리하시는 것을 추천 드립니다.

3개의 좋아요

그렇게 하면, movements 테이블의 레코드가 enum 멤버들을 조합하여 나타낼 수 있는 모든 값을 가지고 있어야 하는거 아닌지요?

대충 봐도 2^(n-1)(n은 enum의 멤버 갯수) 만큼의 레코드를 데이터 베이스가 저장하고 있어야 하는 것같은데요.

n=4 => 16개,
n=10 => 1024 개,

이는 모든 정수값에 일련번호를 붙이고, 그 일련번호로 정수를 사용하는 것과 다르지 않아보이는데요?

1개의 좋아요

상태마다 컬럼을 만들지는 본인 의지 입니다.

드린 의견은 동일 테이블에 자주 업데이트 되는 컬럼을 만들 경우 생기는 병목 현상 방지가 주 목적입니다.

1개의 좋아요