데이터 직렬화

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

Rails는 JSON, YAML 또는 기타 형식으로 직렬화된 데이터를 데이터베이스에 저장할 수 있게 합니다. 이러한 필드는 다음과 같이 정의될 수 있습니다.

class Issue < ActiveRecord::Model
  serialize :custom_fields
end

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

직렬화된 데이터는 덜 강력합니다

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

공간이 낭비됩니다

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

관리가 어렵습니다

직렬화된 데이터에 새로운 필드를 추가하거나 기존 필드를 변경해야 하는 경우가 올 수 있습니다. 직렬화된 데이터를 사용하면 이 작업이 어렵고 매우 시간이 많이 소요됩니다. 이를 위해서는 다음을 수행해야 합니다:

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

반면에 일반적인 열을 사용한다면 열을 추가하는 것은 다음과 같을 것입니다.

ALTER TABLE 테이블명 ADD COLUMN 열이름 유형;

이렇게 하면 매우 적은 시간이 소요되며 즉시 모든 행에 적용됩니다. 큰 JSON 또는 YAML 구조를 다시 작성할 필요가 없습니다.

마지막으로 JSON 또는 YAML 구조가 더 이상 충분하지 않고 이를 사용하지 않으려는 경우가 올 수 있습니다. 몇 개의 행만 저장하는 경우 문제가 되지 않을 수 있지만 수백만 개의 행을 저장하는 경우 해당 마이그레이션은 몇 시간 또는 심지어 몇 일이 걸릴 수 있습니다.

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

JSON이나 YAML로 데이터를 저장하는 경우 사실상 데이터베이스를 문서 저장소(예: MongoDB)처럼 사용하는 것이지만 전형적인 RDBMS가 제공하는 강력한 기능들이나 전형적인 문서 저장소가 제공하는 기능들(예: 가변 필드의 문서 필드 색인화 기능)을 사용하는 것은 아닙니다. 다시 말해, 그것은 낭비입니다.

일관된 필드

가끔 직렬화된 데이터를 사용하는 것이 필요한 때로 주로 저장해야 할 필드와 값이 매우 다양한 경우가 있습니다. 때로는 실제로 그럴 수 있지만 대부분의 경우에는 각 행에 저장하는 필드와 유형이 대부분 동일합니다. 심지어 약간의 차이가 있더라도 별도의 열을 사용하고 필요하지 않은 것들을 설정하지 않으면 됩니다.

해결책

해결책은 별도의 열과/또는 별도의 테이블을 사용하는 것입니다. 데이터베이스에서 제공하는 모든 기능을 사용할 수 있게 하며 데이터를 관리하고 마이그레이션하는 것을 쉽게 만들어줍니다. 공간을 절약하고 데이터를 효율적으로 색인화할 수 있습니다.