데이터 직렬화

요약: 데이터를 직렬화하여 데이터베이스에 저장하는 대신, 별도의 열 및/또는 테이블을 사용하세요. 이는 쉼표로 구분된 값을 문자열로 저장하는 것을 포함합니다.

Rails를 사용하면 JSON, YAML 또는 기타 형식으로 데이터를 직렬화하여 저장할 수 있습니다. 해당 필드는 다음과 같이 정의될 수 있습니다.

class Issue < ActiveRecord::Model
  serialize :custom_fields
end

데이터를 직렬화하여 데이터베이스에 저장하는 것이 유혹적일 수 있지만, 이는 많은 문제점을 가지고 있습니다. 이 문서에서는 이러한 문제점을 설명하고 대안을 제시합니다.

직렬화된 데이터의 기능이 떨어집니다

관계형 데이터베이스를 사용할 때는 개별 필드를 쿼리하거나 스키마를 변경하거나 데이터를 색인화하는 등의 기능이 있습니다. 그러나 직렬화된 데이터를 사용하면 이러한 것들은 매우 어렵거나 완전히 불가능해집니다. PostgreSQL은 JSON 필드를 쿼리하는 기능을 제공하지만 대부분 특수한 용도로 사용되며 일반적인 용도로는 제공되지 않습니다. YAML을 사용하는 경우 데이터를 쿼리할 수 있는 방법이 전혀 없습니다.

공간 낭비

JSON 또는 YAML과 같이 직렬화된 데이터를 저장하면 많은 공간이 낭비됩니다. 이는 이러한 형식이 저장하는 데이터 외에도 추가 문자(예: 이중 인용부호 또는 개행)를 포함하기 때문입니다.

관리가 어려움

직렬화된 데이터에 새 필드를 추가하거나 기존 필드를 변경해야 하는 경우가 옵니다. 직렬화된 데이터를 사용하면 이러한 작업이 어렵고 매우 시간이 많이 소요됩니다. 왜냐하면 저장된 모든 값들을 다시 작성해야 하기 때문입니다. 이를 위해 다음과 같은 작업이 필요합니다:

  1. 데이터 검색
  2. Ruby 구조로 파싱
  3. 변경
  4. 문자열로 다시 직렬화
  5. 데이터베이스에 저장

반면에, 일반적인 열을 사용하는 경우에는 열을 추가하는 것이 다음과 같이 될 것입니다:

ALTER TABLE 테이블_이름 ADD COLUMN _이름 유형;

이러한 쿼리는 매우 적은 시간을 소비하며 모든 행에 즉시 적용됩니다. 많은 JSON 또는 YAML 구조를 다시 작성할 필요가 없습니다.

마지막으로, JSON 또는 YAML 구조로만 저장하는 것이 더 이상 충분하지 않을 때가 옵니다. 몇 개의 행만 저장하는 경우에는 문제가 되지 않겠지만, 수백만개의 행을 저장하는 경우에는 이러한 마이그레이션이 몇 시간 또는 며칠이 걸릴 수 있습니다.

관계형 데이터베이스는 문서 저장소가 아닙니다

JSON이나 YAML과 같이 데이터를 저장할 때, 데이터베이스를 사실상 문서 저장소(예: MongoDB)처럼 사용하게 됩니다. 그러나 전통적인 RDBMS가 제공하는 강력한 기능 또는 전형적인 문서 저장소(예: 가변 필드로 문서의 필드를 색인화하는 기능) 중 어느 것도 사용하고 있지 않습니다. 다시 말해, 이는 낭비입니다.

일관된 필드

직렬화된 데이터를 지지지 않을 경우, 널리 다양한 필드와 값을 저장해야 한다는 주장이 가끔씩 됩니다. 때로는 실제로 그런 경우가 있지만, 99%의 경우에는 각 행에 저장되는 필드와 타입이 거의 동일합니다. 심지어 약간의 차이가 있더라도 별도의 열을 사용하고 필요 없는 필드는 설정하지 않으면 됩니다.

해결책

해결책은 별도의 열 또는 별도의 테이블을 사용하는 것입니다. 이를 통해 데이터베이스가 제공하는 모든 기능을 사용할 수 있으며, 데이터를 관리하고 마이그레이션하는 것이 더 쉬워지며, 공간을 절약하고 데이터를 효율적으로 색인화할 수 있습니다.