InfoGrab DocsInfoGrab Docs

데이터 직렬화

요약

요약: 데이터베이스에 직렬화된 데이터를 저장하지 마세요. Rails는 JSON, YAML 또는 다른 형식으로 직렬화된 데이터를 저장할 수 있도록 해 줍니다. 데이터베이스에 직렬화된 데이터를 저장하고 싶을 수 있지만, 이에는 많은 문제가 있습니다.

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

Rails는 JSON, YAML 또는 다른 형식으로 직렬화된 데이터를 저장할 수 있도록 해 줍니다. 이러한 필드는 다음과 같이 정의할 수 있습니다:

class Issue < ActiveRecord::Model
  serialize :custom_fields
end

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

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

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

공간 낭비#

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

관리의 어려움#

직렬화된 데이터에 새 필드를 추가하거나 기존 필드를 변경해야 할 때가 옵니다. 직렬화된 데이터를 사용하면 이 작업이 어려워지고 시간이 많이 소요됩니다. 유일한 방법은 저장된 모든 값을 다시 작성하는 것이기 때문입니다. 이를 수행하려면 다음과 같은 과정이 필요합니다:

  • 데이터를 가져오기

  • Ruby 구조체로 파싱하기

  • 변경하기

  • 다시 문자열로 직렬화하기

  • 데이터베이스에 저장하기

반면, 일반 칼럼을 사용한다면 칼럼을 추가하는 것은 다음과 같이 간단합니다:

ALTER TABLE table_name ADD COLUMN column_name type;

이러한 쿼리는 거의 시간이 걸리지 않으며, 대용량 JSON이나 YAML 구조를 다시 작성하지 않고도 모든 행에 즉시 적용됩니다.

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

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

JSON이나 YAML로 데이터를 저장하면 본질적으로 데이터베이스를 문서 저장소(예: MongoDB)처럼 사용하는 것입니다. 단, 일반적인 RDBMS가 제공하는 강력한 기능도 사용하지 않고, 일반적인 문서 저장소가 제공하는 기능(예: 가변 필드를 가진 문서의 필드 인덱싱 기능)도 사용하지 않습니다. 다시 말해, 낭비입니다.

일관된 필드#

직렬화된 데이터를 지지하는 논거 중 하나는 다양한 필드와 값을 저장해야 한다는 것입니다. 때로는 실제로 그런 경우가 있으며, 그럴 때는 직렬화된 데이터를 사용하는 것이 합리적일 수 있습니다. 그러나 99%의 경우, 저장되는 필드와 유형은 모든 행에서 동일한 경향이 있습니다. 약간의 차이가 있더라도 별도의 칼럼을 사용하고 필요하지 않은 칼럼은 설정하지 않으면 됩니다.

해결책#

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

데이터 직렬화

GitLab v19.1
원문 보기
요약

요약: 데이터베이스에 직렬화된 데이터를 저장하지 마세요. Rails는 JSON, YAML 또는 다른 형식으로 직렬화된 데이터를 저장할 수 있도록 해 줍니다. 데이터베이스에 직렬화된 데이터를 저장하고 싶을 수 있지만, 이에는 많은 문제가 있습니다.

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

Rails는 JSON, YAML 또는 다른 형식으로 직렬화된 데이터를 저장할 수 있도록 해 줍니다. 이러한 필드는 다음과 같이 정의할 수 있습니다:

class Issue < ActiveRecord::Model
  serialize :custom_fields
end

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

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

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

공간 낭비#

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

관리의 어려움#

직렬화된 데이터에 새 필드를 추가하거나 기존 필드를 변경해야 할 때가 옵니다. 직렬화된 데이터를 사용하면 이 작업이 어려워지고 시간이 많이 소요됩니다. 유일한 방법은 저장된 모든 값을 다시 작성하는 것이기 때문입니다. 이를 수행하려면 다음과 같은 과정이 필요합니다:

  • 데이터를 가져오기

  • Ruby 구조체로 파싱하기

  • 변경하기

  • 다시 문자열로 직렬화하기

  • 데이터베이스에 저장하기

반면, 일반 칼럼을 사용한다면 칼럼을 추가하는 것은 다음과 같이 간단합니다:

ALTER TABLE table_name ADD COLUMN column_name type;

이러한 쿼리는 거의 시간이 걸리지 않으며, 대용량 JSON이나 YAML 구조를 다시 작성하지 않고도 모든 행에 즉시 적용됩니다.

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

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

JSON이나 YAML로 데이터를 저장하면 본질적으로 데이터베이스를 문서 저장소(예: MongoDB)처럼 사용하는 것입니다. 단, 일반적인 RDBMS가 제공하는 강력한 기능도 사용하지 않고, 일반적인 문서 저장소가 제공하는 기능(예: 가변 필드를 가진 문서의 필드 인덱싱 기능)도 사용하지 않습니다. 다시 말해, 낭비입니다.

일관된 필드#

직렬화된 데이터를 지지하는 논거 중 하나는 다양한 필드와 값을 저장해야 한다는 것입니다. 때로는 실제로 그런 경우가 있으며, 그럴 때는 직렬화된 데이터를 사용하는 것이 합리적일 수 있습니다. 그러나 99%의 경우, 저장되는 필드와 유형은 모든 행에서 동일한 경향이 있습니다. 약간의 차이가 있더라도 별도의 칼럼을 사용하고 필요하지 않은 칼럼은 설정하지 않으면 됩니다.

해결책#

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