데이터 직렬화
요약: 직렬화된 데이터를 데이터베이스에 저장하지 말고, 대신 별도의 열과/또는 테이블을 사용하세요. 여기에는 문자열로서 쉼표로 구분된 값을 저장하는 것도 포함됩니다.
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%의 경우 저장되는 필드와 유형은 모든 행에서 동일한 경향이 있습니다. 약간의 차이가 있더라도 별도의 열을 사용하고 필요하지 않은 열은 설정하지 않을 수 있습니다.
해결책
해결책은 별도의 열과/또는 별도의 테이블을 사용하는 것입니다. 이를 통해 데이터베이스에서 제공하는 모든 기능을 활용할 수 있으며, 데이터를 관리하고 마이그레이션하는 것이 더 쉬워지고, 공간을 절약하며, 데이터를 효율적으로 인덱싱할 수 있습니다.