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 를 사용할 예정입니다.

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

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

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

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

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

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

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

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

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

Master (1) - State (N)

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

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

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

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

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

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

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

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

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

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

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

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

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

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