Skip to content

PostgreSQL JSON Types #
Find similar titles

Structured data

Category
Database

JSON Types #

JSON(JavaScript Object Notation)은 데이터 객체를 전달하기 위한 표준 포맷이다. 자바스크립트 언어로부터 파생되었지만, 자바·파이썬 등 다양한 프로그래밍 언어에서 JSON 포맷을 사용하고 있다. {key:value} 또는 [value 1, value 2…] 와 같이 키:값 쌍으로 이루어져 있거나 배열 형태의 구조를 가진다.

{
    "height" : [
        {"h": 176, "d": "2019-01-02"},
        {"h": 178, "d": "2020-01-04"},
        {"h": 180, "d": "2020-11-30"}
    ]
}

PostgreSQL JSON Types #

PostgreSQL은 9.2 버전 이후부터 JSON 데이터 타입을 제공한다. JSON 타입을 이용하면 스키마에 엄격한 관계형 데이터베이스에서 비관계형 데이터베이스의 장점인 스키마가 없는 이점을 이용할 수 있다. 스키마 추가 없이 데이터를 확장하여 관리할 수 있다.

CREATE TABLE patient
(
  id serial NOT NULL,
  physicl_exmn JSON
);

위 patient 테이블의 physicl_exmn 컬럼을 JSON 타입으로 설정하였다. 신체검사 측정일별 신장 정보를 저장하기 위해 아래와 같이 JSON 포맷의 텍스트 데이터를 저장할 수 있다.

INSERT INTO patient (physicl_exmn)
VALUES (
    '{
        "height" : [
            {"h": 176, "d": "2019-01-02"},
            {"h": 178, "d": "2020-01-04"},
            {"h": 180, "d": "2020-11-30"}
        ]
    }'
)

INSERT 된 데이터를 조회하면 physicl_exmn 컬럼에 JSON 타입으로 데이터가 저장된 것을 확인할 수 있다. JSON 타입을 사용하지 않는다면 신체검사 측정일별 신장 값은 id와 1:N 관계로 신장 값을 저장할 별도의 테이블을 생성하여 관리하거나, 신장 컬럼에 배열 또는 배열형태의 텍스트를 저장할 것이다. 끔찍하게도 데이터를 조회하기 위하여 전자는 테이블 간 조인을 해야 하고 후자는 파싱이라는 작업을 거쳐야 한다. 하지만 이것이 최악의 상황은 아니다. 만약 두 번째 환자부터는 신체검사 항목에 몸무게 측정이 추가되었다면 어떻게 해야 할까? 몸무게 테이블을 생성할 것인가? 몸무게 컬럼을 추가할 것인가? JSON 데이터 타입에서는 아래와 같이 weight 객체가 추가된 JSON 포맷 데이터를 INSERT 하면 된다.

INSERT INTO patient (physicl_exmn)
VALUES (
    '{
        "height" : [
            {"h": 162, "d": "2019-02-15"},
            {"h": 163, "d": "2020-02-25"}
        ], 
        "weight" : [
            {"w": 64, "d": "2019-02-15"},
            {"h": 65, "d": "2020-02-25"}
        ]
    }'
)

지금까지 patient 테이블에는 id 1, 2의 두 개의 row data가 존재하고 각각의 physicl_exmn 컬럼에는 신장 정보를 가진 JSON과 신장 정보, 체중 정보를 모두 가진 JSON 데이터가 저장되어 있다. JSON 데이터 타입을 이용하지 않고 위 예시와 같이 신체정보를 저장하는 방법은 여러분 능력에 맡기겠다.

JSON 데이터 조회 #

JSON 데이터 조회를 위해 ->->> 같은 JSON 오퍼레이터를 사용한다. JSON 오퍼레이터에 대해서는 PostgreSQL/JSON Functions and Operators 편에 자세히 기술하도록 하겠다. patient 테이블에서 키 정보를 조회하기 위해서 아래와 같이 질의가 가능하다.

SELECT PHYSICL_EXMN -> 'height'
FROM PATIENT
WHERE ID = 1;

#reuslt : [
    {
        "d": "2019-01-02",
        "h": 176
    },
    {
        "d": "2020-01-04",
        "h": 178
    },
    {
        "d": "2020-11-30",
        "h": 180
    }
]

신장 정보를 배열형식의 JSON 타입으로 조회할 수 있다. -> 대신 ->>을 사용하면 신장 정보를 텍스트 형태로 조회할 수 있다. 신장 정보 배열에서 첫 번째 값의 신장 정보만 조회하고 싶을 때는 아래와 같다.

SELECT PHYSICL_EXMN -> 'height' -> 0 -> 'h'
FROM PATIENT
WHERE ID = 1;

#reuslt : 176

JSON, JSONB #

PostgreSQL에서 제공하는 JSON 데이터 타입에는 위의 예시로 든 JSON 타입과 JSONB 타입이 있다. JSON 타입은 입력된 값(텍스트)을 그대로 저장한다. 따라서 JSON 타입으로 데이터를 조회할 때 텍스트값을 JSON 객체로 구문 분석을 수행하기 때문에 JSONB에 비해 속도가 느리다. JSONB 타입은 JSON BLOB의 줄임 말로 질의에 최적화된 형태로 공백, 중복 등을 제거해 질의를 위한 최적의 형태로 JSON 객체를 저장하기 때문에 질의할 때 구문분석 없이 진행한다. 데이터 저장 이후 추가 질의가 발생하지 않거나 데이터양이 많지 않다면 JSON 타입을 사용하고 잦은 질의나 데이터양이 많다고 예상되면 JSONB 타입으로 저장하는 것이 좋다.

참고 출처 #

관련 키워드 #

PostgreSQL JSON JSONB

Incoming Links #

Related Data Sciences #

Suggested Pages #

0.0.1_20140628_0