데이터 직렬화
개요: 데이터를 직렬화하여 데이터베이스에 저장하는 대신 별도의 열 및/또는 테이블을 사용하십시오. 이에는 쉼표로 구분된 값을 문자열로 저장하는 것도 포함됩니다.
Rails를 사용하면 JSON, YAML 또는 기타 형식의 직렬화된 데이터를 데이터베이스에 저장할 수 있습니다. 해당 필드는 다음과 같이 정의할 수 있습니다.
class Issue < ActiveRecord::Model
serialize :custom_fields
end
데이터를 데이터베이스에 직렬화하여 저장하는 것은 유혹적일 수 있지만, 이로 인해 많은 문제가 발생합니다. 본 문서에서는 이러한 문제점을 개요하고 대안을 제시합니다.
직렬화된 데이터의 능력이 덜함
관계형 데이터베이스를 사용할 때는 개별 필드를 쿼리하거나 스키마를 변경하고 데이터를 인덱싱하는 등의 기능을 활용할 수 있습니다. 반면에 직렬화된 데이터를 사용하면 이 모든 것이 매우 어렵거나 불가능해집니다. PostgreSQL은 JSON 필드를 쿼리할 수 있는 기능을 제공하지만, 이는 매우 특수한 use case를 위한 것으로, 보다 일반적인 용도에는 적합하지 않습니다. YAML을 사용한 경우 데이터를 쿼리할 수 있는 방법이 없습니다.
공간의 낭비
JSON 또는 YAML과 같은 직렬화된 데이터를 저장하면 많은 공간이 낭비됩니다. 이는 이러한 형식이 저장하려는 데이터 이외에도 추가 문자(예: 쌍따옴표 또는 새 줄)를 포함하기 때문입니다.
관리가 어려움
직렬화된 데이터에 새 필드를 추가하거나 기존 필드를 변경해야 하는 시점이 올 수 있습니다. 직렬화된 데이터를 사용하면 이를 수행하는 것이 어려우며 매우 시간이 소요됩니다. 직렬화된 값을 모두 다시 작성해야 하기 때문입니다. 다음 단계를 거쳐 수행해야 합니다.
- 데이터 검색
- 루비 구조로 구문 분석
- 변형
- 문자열로 다시 직렬화
- 데이터베이스에 저장
반면에, 보통의 열을 사용하면 열을 추가하는 것이 다음과 같이 간단합니다.
ALTER TABLE table_name ADD COLUMN column_name type;
이 쿼리는 매우 적거나 이에 준하는 시간이 소요되며 모든 행에 즉시 적용됩니다. 큰 JSON 또는 YAML 구조체를 다시 작성할 필요가 없습니다.
마지막으로, JSON 또는 YAML 구조가 더 이상 충분하지 않은 경우가 올 수 있습니다. 일부 행만 저장하는 경우에는 문제가 되지 않을 수 있지만, 수백만 개의 행을 저장하는 경우 이러한 이주 작업은 몇 시간이나 걸릴 수 있습니다.
관계형 데이터베이스는 문서 리포지터리가 아닙니다
JSON 또는 YAML로 데이터를 저장하면 데이터베이스를 본질적으로 문서 리포지터리(예: MongoDB)처럼 사용하는 것인데, 전형적인 RDBMS가 제공하는 강력한 기능이나 전형적인 문서 리포지터리가 제공하는 기능(예: 변수 필드를 갖는 문서의 필드 색인화 기능)을 활용하지 않는 것과 같습니다. 다시 말해, 이는 낭비입니다.
일관된 필드
가끔 직렬화된 데이터의 지지를 주장할 때 제시되는 주장 중 하나는 넓게 변동하는 필드와 값을 저장해야 한다는 것입니다. 때로는 실제로 그렇지만, 99%의 경우에는 각 행마다 저장되는 필드와 유형이 거의 동일합니다. 심지어 약간의 차이가 있더라도 별도의 열을 사용하고 필요 없는 것은 설정하지 않으면 됩니다.
해결책
해결책은 별도의 열 및/또는 별도의 테이블을 사용하는 것입니다. 이렇게 하면 데이터베이스에서 제공하는 모든 기능을 활용할 수 있으며, 데이터를 관리하고 마이그레이션하기가 더 쉬워지며, 공간을 절약할 수 있고 데이터를 효율적으로 색인화할 수 있습니다.