Enum 생성하기
GitLab 데이터베이스에서 SMALLINT 타입의 enum을 올바르게 생성하고 FOSS에 키/값 쌍을 정의하는 방법을 설명합니다.
데이터가 정적이고, 런타임에 절대 변경되지 않으며, Cell 전체에서 일관된 ID를 가져야 하는 경우, 데이터베이스 기반 enum 대신 고정 항목 모델(fixed items model) 을 사용하는 것을 고려하세요. 새 enum을 생성할 때는 데이터베이스 타입으로 SMALLINT 를 사용해야 합니다. SMALLINT 타입의 크기는 2바이트로, enum에 충분합니다. 이를 통해 데이터베이스 공간을 절약할 수 있습니다. 이 타입을 사용하려면 칼럼을 생성하는 마이그레이션에 limit: 2 를 추가하세요. 예시: def change add_column :ci_job_artifacts, :file_format, :integer, limit: 2 end 모든 키/값 쌍은 FOSS에 정의해야 합니다 # 요약 : 모델이 FOSS의 일부인 경우, 모든 enum은 FOSS에 정의되어야 합니다. class Model < ApplicationRecord enum platform: { aws: 0, gcp: 1 # EE-only } end enum 에 새 키/값 쌍을 추가할 때 해당 쌍이 EE 전용인 경우, 다음과 같이 enum 을 구성하고 싶을 수 있습니다: # Define `failure_reason` enum in `Pipeline` model: class Pipeline < ApplicationRecord enum failure_reason: Enums::Pipeline.failure_reasons end # Define key/value pairs that used in FOSS and EE: module Enums module Pipeline def self.failure_reasons { unknown_failure: 0, config_error: 1 } end end end Enums::Pipeline.prepend_mod_with('Enums::Pipeline') # Define key/value pairs that used in EE only: module EE module Enums module Pipeline override :failure_reasons def failure_reasons super.merge(job_activity_limit_exceeded: 2) end end end end 이 방식은 동작하지만, 다음과 같은 몇 가지 단점이 있습니다: EE에서 FOSS에 정의된 값과 충돌 하는 키/값 쌍을 정의할 수 있습니다. 예를 들어, EE::Enums::Pipeline 에 job_activity_limit_exceeded: 1 을 정의하는 경우입니다. 이런 일이 발생하면, 기능이 완전히 다르게 동작합니다. 예를 들어, failure_reason 이 config_error 인지 job_activity_limit_exceeded 인지 알 수 없게 됩니다. 이런 일이 발생하면, 데이터 무결성을 수정하기 위한 데이터베이스 마이그레이션을 배포해야 하는데, 원래 값을 복구할 수 없는 경우 불가능할 수 있습니다. 또한, E