2014-05-12 2 views
1

내 레거시 데이터베이스 (Postgres 9.1)에는 다양한 종류의 문서가 들어있는 여러 개의 테이블이 있습니다 ('부모'테이블이라고 가정 해 봅시다). 갱신 된 데이터 모델에서 hstore를 사용해야합니까?

create table params (
    kind integer, 
    docid integer, 
    parname text, 
    parvalue text, 
    constraint params_pk primary key (kind, docid, parname)); 

많은 (parname, parvalue)가있을 수 있습니다 하나 개의 문서에 대한쌍 : 또한,이 문서에 대한 다양한 매개 변수가있는 테이블이 있습니다. 종류은 다른 테이블을 가리키며 외래 키로 사용할 수 없습니다.

매개 변수은 문서 인쇄용으로 만 사용되었습니다. 이제이 테이블에는 5 백만 개의 행이 포함되어 있으며 다른 목적으로도 데이터가 필요합니다. 그래서이 모델을 갱신해야 할 때가 왔습니다.

기본적으로 매개 변수은 문서에 대해 한 번 삽입되며 거의 업데이트되지 않습니다. 그것들은 전체적으로 읽혀질 것입니다 (문서 용). 특정 을 검색 할 필요가 없습니다.

변형의 A. 분할 테이블의 부모 테이블에 외국 키로 DOCID를 사용에 따라 여러 테이블에 PARAMS :

나는 세 가지 아이디어가 있습니다.

변형 된 B. 분할 테이블 A의 변형으로서 PARAMS(parname, parvalue) hstore 같은 저장한다.

변형 C 12. 모든 부모 테이블에 hstore 필드를 추가하고 추가 테이블을 잊어 버리십시오.

나는 hstore에 대한 경험이 없습니다. 각 변형의 죄수 및 찬성은 무엇입니까? 어느 것을 선택 하시겠습니까? hstore는 이상한 무엇인가 나를 당황시킬 수 있습니까?

답변

2

3 번째 옵션에 투표하십시오. 테이블 수가 적을수록 더 좋은 수면을 취할 수 있습니다.

Hstore는 1 레벨 매개 변수 목록을 위해 개발되었습니다. 그것은 안정적이고 빠르고 간단하며 귀하의 필요에 완벽하게 부합합니다. 나는 전에 비슷한 일을했다. 더 쉬운 변환을 위해 집계를 썼습니다.

create or replace function hstore_add(hstore, text, text) 
returns hstore language plpgsql 
as $$ 
begin 
    return case 
     when $1 isnull then hstore($2, $3) 
     else $1 || hstore($2, $3) end; 
end $$; 

create aggregate hstore_agg (text, text) (
    sfunc = hstore_add, 
    stype = hstore 
); 

시간이 절약 될 수 있습니다.

select kind, docid, hstore_agg(parname, parvalue) 
from params 
group by 1, 2 
order by 1, 2; 
+0

완료! 현재 개발 환경. 내가 기대할 수있는 것보다 쉬웠다. 시간을 절약 할 수있는 코드를 위해 klin을 모두 주셔서 감사합니다! –

1

문서로 필드를 가져와야하는 경우 서버가 여러 위치를 사용하여 디스크에있는 단일 위치에서 전체 문서를 가져올 수 있기 때문에 비정형 화 된 hstore 변형이 더 좋습니다. 필드가있는 문서. hstore에서 볼 수있는 유일한 문제는 다소 틀에 박힌 구문입니다. JSON으로 작업하기가 더 쉬울 수도 있습니다. PostgreSQL 9.4는 (indexed) binary JSON을 훌륭하게 지원합니다. 바이너리 JSON 사용은 hstore 제작자 인 BTW가 recommended입니다.

따라서 9.3에서는 json 열을 사용하고 9.4에서는 jsonb으로 변환하는 것이 좋습니다.

+0

간단한 키/값 쌍의 경우 hstore가 JSON보다 나은 선택이라고 생각합니다. –

+0

@a_horse_with_no_name 기술적으로 hstore는 바이너리 JSON보다 우수하지 않으며 JSON을 사용하면 클라이언트 측에서 기존 JSON 라이브러리를 재사용하면 도움이 될 수 있습니다. – ArtemGr