2010-01-05 4 views
8

postgreSQL 데이터베이스를 사용해야하며 현재 사용중인 berkeleyDB를 대체합니다. 이기는 하지만; 나는 이것이 이상적인 상황이 아니라는 것을 깨닫는다. 그것은 나의 통제를 벗어난 것이다.PostgreSQL 데이터베이스를 간단한 키 값 저장소로 사용하는 가장 좋은 방법

그래서 질문이 있습니다 ... 가능한 한 효율적으로 만드는 동안 postgreSQL을 핵심 가치 저장소에 만들어야한다면 어떻게해야할까요?

내 값은 바이트 배열이고 내 키는 문자열이며,이 문자열의 길이에는 몇 가지 제한이 있습니다.

키를 보유하고있는 내 값과 기본 키 열에 BLOB를 사용해야한다고 가정하지만 스택 오버플로 커뮤니티에있는 누군가가이 작업을 수행했는지 또는이 것이 있는지 궁금합니다. 특정 'gotchas'나는 밖으로보아야한다.

+0

그 바이트 배열이 실제로 무엇을 상징 않습니다
여기 는 문서 페이지입니다? 파일 내용? 직렬화 된 객체? 다른 사람? – BalusC

+0

그들은 실제로 서버에 보내지는 직렬화 된 actionscript 객체입니다 ... 그러나 서버 코드는 그 안에 무엇이 있는지 신경 쓰지 않습니다. 그렇습니다. 관계형 데이터베이스를 키 값 저장소로 사용하는 것은 다소 불합리하다는 점에 동의합니다. 그러나 효율적인 파일 io, 암호화, 사용자 액세스 제한 등과 같은 데이터베이스 사용의 장점 중 일부는 여전히 유지되고 있습니다. 정말 미친 것입니까? – dennisjtaylor

+0

예. http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/ –

답변

18

제대로 수행하기위한 Postgresql의 확장 기능을 hstore라고합니다. 다른 키 - 값 저장 시스템을 기대하는 것과 비슷한 방식으로 작동합니다. 확장 기능을로드하기 만하면됩니다. 구문은 독특하지만 redis 또는 mongo를 사용한 적이 있다면 빨리 얻을 수 있습니다. 그것보다 더 열심히하지 마십시오. 나는 종종 우리 도구를 선택하지 않아야한다고 이해합니다.

http://www.postgresql.org/docs/9.1/static/hstore.html

+3

이것은 정답입니다 ... – AlexCode

+1

다음은 확장 기능을로드하는 방법입니다. DBA 또는 수퍼 유저 여야합니다. CREATE EXTENSION HSTORE; – Stradas

0

값으로 저장해야하는 항목은 무엇입니까? 문자열? Ints? 객체 (예 : 직렬화 된 Java 객체). 간단한 구현은 다음과 같은 3 열 표로 작동합니다.

NAME(VARCHAR) TYPE(VARCHAR) VALUE(VARCHAR) 

(아마도 TYPE은 일부 열거 형입니다). 위의 코드는 직렬화 된 객체와 같은 바이너리 데이터에서는 작동하지 않지만 BLOB가 필요할 수도 있습니다.

(또는 아마도 개 이상이 더) Apache Commons Configuration을 보았습니까? 당신은 (JDBC를 통해) 데이터베이스와 그를 백업 할 수 있습니다 당신은 당신이 이렇게을 검색하도록 속성을 저장할 수 있습니다 : 구현의 관점에서 당신에게 슬픔을 많이 절약 할 수 있습니다

// get a property called 'number' 
Double double = config.getDouble("number"); 
Integer integer = config.getInteger("number"); 

합니다. 에 바이너리 데이터를 저장하는 데 문제가있을 수 있습니다. 삽입 및 사후 검색 전에 직렬화해야한다는 점에서 이진 데이터를 저장하는 데 문제가 있습니다. 하지만 XStream을 통해 int, double 및 직렬화 된 Java 객체를 저장하는 데 과거에 이것을 사용 했으므로 제대로 작동하는지 확인할 수 있습니다.

0

실제로 키가 무엇인지에 의존해야합니다. 항상 255 자 미만의 문자열 인 경우 Varchar를 yoru PK로 사용하고 BLOB (큰 값으로 가정)을 값으로 사용합니다. 항상 등의 숫자를 사용 INT, 즉

될 것입니다 경우, 정말 당신에게 좋은 대답 : 관계형 데이터베이스를 사용하도록 강제하는 경우

2

것은, I가 제안을 제공하기 위해 더 많은 정보를 필요 구조화되지 않은 데이터 및 키 - 값 저장소에서 얻은 속도의 이점을 활용할 수 없으므로 데이터에서 구조를 찾아 실제로 활용하십시오. 더 많은 구조를 발견할수록 귀하는 곤경에서 벗어날 수 있습니다. 키의 구조 만 찾더라도.

데이터에 대한 순차적 또는 임의적 액세스 만 필요하고이 요구 사항에 따라 데이터베이스의 비율 및 구조가 필요한지 고려하십시오. 예를 들어 유형별로 값에 대한 쿼리를 수행 할 예정입니까? 이러한 각각의 질문은 데이터베이스 구성 방법에 영향을 줄 수 있습니다.

내부적으로 pg_largetable (loid : oid, pageno : int4, data : bytea)로 표시되는 postgresql의 blob에 대한 특정 고려 사항 중 하나입니다. 청크의 크기는 LOBBLKSIZE로 정의되지만 일반적으로 2k입니다. 블롭 대신 테이블에서 바이트 배열을 사용하고 블럭 크기에서 값/키 쌍의 크기를 제한 할 수 있다면 두 번째 테이블을 통해이 간접 참조를 피할 수 있습니다. 데이터베이스 구성에 액세스 할 수있는 경우 블록 크기를 늘릴 수도 있습니다.

데이터 액세스의 데이터 및 패턴 구조를 찾고 더 자세하게 질문하는 것이 좋습니다.

관련 문제