데이터 직렬화

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

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

class Issue < ActiveRecord::Model
  serialize :custom_fields
end

데이터를 데이터베이스에 직렬화하여 저장하는 것은 유혹적일 수 있지만, 이로 인해 많은 문제가 발생합니다. 본 문서에서는 이러한 문제점을 개요하고 대안을 제시합니다.

직렬화된 데이터의 능력이 덜함

관계형 데이터베이스를 사용할 때는 개별 필드를 쿼리하거나 스키마를 변경하고 데이터를 인덱싱하는 등의 기능을 활용할 수 있습니다. 반면에 직렬화된 데이터를 사용하면 이 모든 것이 매우 어렵거나 불가능해집니다. PostgreSQL은 JSON 필드를 쿼리할 수 있는 기능을 제공하지만, 이는 매우 특수한 use case를 위한 것으로, 보다 일반적인 용도에는 적합하지 않습니다. YAML을 사용한 경우 데이터를 쿼리할 수 있는 방법이 없습니다.

공간의 낭비

JSON 또는 YAML과 같은 직렬화된 데이터를 저장하면 많은 공간이 낭비됩니다. 이는 이러한 형식이 저장하려는 데이터 이외에도 추가 문자(예: 쌍따옴표 또는 새 줄)를 포함하기 때문입니다.

관리가 어려움

직렬화된 데이터에 새 필드를 추가하거나 기존 필드를 변경해야 하는 시점이 올 수 있습니다. 직렬화된 데이터를 사용하면 이를 수행하는 것이 어려우며 매우 시간이 소요됩니다. 직렬화된 값을 모두 다시 작성해야 하기 때문입니다. 다음 단계를 거쳐 수행해야 합니다.

  1. 데이터 검색
  2. 루비 구조로 구문 분석
  3. 변형
  4. 문자열로 다시 직렬화
  5. 데이터베이스에 저장

반면에, 보통의 열을 사용하면 열을 추가하는 것이 다음과 같이 간단합니다.

ALTER TABLE table_name ADD COLUMN column_name type;

이 쿼리는 매우 적거나 이에 준하는 시간이 소요되며 모든 행에 즉시 적용됩니다. 큰 JSON 또는 YAML 구조체를 다시 작성할 필요가 없습니다.

마지막으로, JSON 또는 YAML 구조가 더 이상 충분하지 않은 경우가 올 수 있습니다. 일부 행만 저장하는 경우에는 문제가 되지 않을 수 있지만, 수백만 개의 행을 저장하는 경우 이러한 이주 작업은 몇 시간이나 걸릴 수 있습니다.

관계형 데이터베이스는 문서 리포지터리가 아닙니다

JSON 또는 YAML로 데이터를 저장하면 데이터베이스를 본질적으로 문서 리포지터리(예: MongoDB)처럼 사용하는 것인데, 전형적인 RDBMS가 제공하는 강력한 기능이나 전형적인 문서 리포지터리가 제공하는 기능(예: 변수 필드를 갖는 문서의 필드 색인화 기능)을 활용하지 않는 것과 같습니다. 다시 말해, 이는 낭비입니다.

일관된 필드

가끔 직렬화된 데이터의 지지를 주장할 때 제시되는 주장 중 하나는 넓게 변동하는 필드와 값을 저장해야 한다는 것입니다. 때로는 실제로 그렇지만, 99%의 경우에는 각 행마다 저장되는 필드와 유형이 거의 동일합니다. 심지어 약간의 차이가 있더라도 별도의 열을 사용하고 필요 없는 것은 설정하지 않으면 됩니다.

해결책

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