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