Programming/데이터베이스

    [PostgreSQL] json, jsonb 타입과 연산자

    데이터베이스 테이블 내 하나의 컬럼에 JSON 데이터를 저장하는 경우가 있습니다. 보통 외부에서 제공된 데이터를 별도의 처리 없이 그대로 저장할 때 JSON 타입으로 저장하게 됩니다. PostgreSQL은 JSON 데이터를 저장하기 위한 2가지 타입인 json과 jsonb 타입을 제공합니다. 1. json vs jsonb 타입 그렇다면 json과 jsonb 타입의 차이점은 무엇일까요? json 타입은 입력된 텍스트 원본을 저장하고, jsonb 타입은 decopmose된 바이너리 형식으로 저장한다는 차이가 있습니다. json 타입은 입력된 텍스트에 대한 정확한 복사본을 저장하기 때문에, 처리할 때마다 매번 파싱을 다시 해야만 합니다. jsonb 타입에 비해 처리 속도가 느리나, 원본 그대로를 저장할 수 있..

    M:N 관계

    M:N 관계 M:N 관계는 관계를 가진 양쪽 당사자 모두에서 1:M관계가 존재할 때 나타나는 모습이다. 학생과 과목의 관계를 예로 들 수 있다. 학생 입장에서는 여러 과목을 수강할 수 있고, 과목 입장에서 보면 여러 학생이 하나의 과목을 선택할 수 있다. 즉, 어느 쪽에서 봐도 다:다 관계가 성립된다. 이 관계는 선천적으로는 테이블과 테이블 사이에 특별한 관계가 없다. 각 테이블은 스스로 존재할 뿐이다. 그런데 이들 사이에 어떤 관계를 맺어 줌으로써 관계가 형성된다. 1. M:N 관계의 문제점 M:N 관계를 그림으로 그려보면 다음과 같다. 위 그림을 보면 각 테이블마다 PK가 존재하는 걸 볼 수 있다. 그러나 테이블 간의 관계가 성립되려면 PK 이외에도 FK가 존재해야 한다. FK를 생성한 테이블은 다음..

    1:M 재귀적 관계

    트리구조처럼 무한히 확장해나가는 모델을 데이터베이스로 어떻게 표현할까? 1:M 재귀적 관계 분류체계 또는 Directory 구조와 같이 1:M 관계가 끊임없이 나아가는 모델이 있다. 이럴 경우에 자식 테이블을 무한히 만들어주어야만 할까? 테이블 안에 PK와 FK를 같이 만들어 줌으로써 해결할 수 있다. 회사와 부서 관계를 예시로 들어보자. 회사에는 여러 부서가 있고, 부서 속에 또 여러 부서가 존재할 수 있다. (EX. 삼성전자 > 총무부 > 총무1팀 > 총무1과...) 이 경우 '상위부서ID'란 Column을 만든 뒤 PK인 부서 ID를 참조함으로써 무한히 확장해나가는 1:M 관계를 표현할 수 있다. 결국 하나의 테이블 안에 모든 부서 간의 1:M 관계를 표현할 수 있게 된다. 이렇게 설계된 테이블을 ..

    1:M 관계

    1:M 관계 1:M 관계는 한쪽이 관계를 맺은 쪽의 여러 객체를 갖는 것을 의미한다. 1:M 관계는 가장 흔하게 나타나는 매우 일반적인 형태이다. 대표적인 예로 부모와 자식 관계, 컴퓨터 Directory 구조가 있다. 테이블은 서로 선천적으로 관계를 갖고 있다.(RDBMS) 1:M 관계는 부모와 자식 관계와 같다. 부모는 자식이 없어도 되고, 자식이 1명 또는 여러명일 수도 있다. 그러나 자식은 부모가 단 한명이어야 하며, 부모없는 자식은 존재하지 않는다. 데이터베이스에서 1:M 관계를 설정하면 부모없는 자식이 생기는 것을 막아준다. 학년 테이블과 반 테이블을 예로 들어볼 수 있다. 여기서 학년 테이블이 부모, 반 테이블이 자식이 된다. 학년테이블의 PK인 학년번호가 반 테이블의 FK인 학년번호와 연결..

    주 식별자 (Primary Key) 설계

    Primary Key 설계 고려사항 목록 1. 유일하고 모든 레코드에 NOT NULL 일 수 있는 컬럼을 찾는다. 2. 후보 식별자가 없는 경우 임의의 식별자를 만들어 부여한다. (인조 식별자) 3. PK의 데이터 타입을 결정한다. 1) 레코드의 발생 가능한 최대 수를 예측한다. 예) 1년에 몇개 정도 발생하는가? 한 달에 몇개 정도 발생하는가? 처리해야 하는 대상이 대략 몇개정도 되는가? 4. 발생 가능한 최대 레코드 수를 커버할 수 있는 데이터 타입을 선정한다. 1) 만일 대상 레코드가 수십 만개 정도라면 999,999로 커버할 수 있다. 따라서 32bit int(2,147,483,647)를 사용할 수 있다. varchar(6)을 사용해서 '999999' 까지 처리할 수 있다. 5. PK의 데이터 타..

    관계형 데이터베이스(RDBMS), 주식별자와 후보식별자

    1. 관계형 데이터베이스 데이터베이스란 구조화된 데이터들의 집합이다. 1) 관계형 데이터베이스 특징 고유 식별자 테이블은 각 행(레코드)를 식별하기 위해 고유 식별자를 정의할 수 있음 고유 식별자는 Not NULL, UNIQUE 속성을 갖음 고유 식별자는 하나 또는 여러 개의 컬럼들로 정의할 수 있음 참조 무결성 테이블에서 외래키를 선언 외래키는 다른 테이블에 정의된 고유 식별자를 참조 외래키의 값은 다른 테이블에 정의된 고유 식별자의 값의 범위를 넘을 수 없도록 제한됨 2. 주식별자와 후보식별자 1) 키의 정의 하나의 테이블에서 각 레코드를 고유하게 식별할 수 있는 컬럼 또는 컬럼의 조합 키의 조건은 NOT NULL, UNIQUE(유일성) 테이블 디자인 시 키를 정하고 테이블을 데이터베이스에 만들 때 ..