2012-05-22 3 views
3

우리는 django-dbarray 모듈을 사용하여 포스트그레스에 배열을 사용합니다. postgres 배열에 관한 연구를 해왔고 일부 개발자는 X 값 이상을 저장하는 postgres 배열의 사용을 권장하지 않는다고 말했습니다. 때로는 이것이 10 살이며 30 대까지 들었습니다. 성능이 점점 줄어들 기 전에 어레이에 얼마나 많은 값을 저장할 수 있거나 저장해야하는지에 대한 합의가 있습니까?Postgres 배열

위의 DB는 주로 읽기 전용 DB입니다.

중간 테이블을 사용해야하는 위치와 포스트그레스 배열을 사용해야하는 위치를 결정하려고합니다.

또 하나의 추가 질문 : 테이블의 열에 대해 색인을 생성 할 때 해당 열에 배열 값이 저장되는 위치 (bigint []라고 가정 해 봅시다). 배열에 저장된 값은 인덱싱되지 않지만 배열 자체 만 이해합니다 (C 포인터와 비슷하다고 가정합니다). 이것이 단순히 중간 테이블을 갖는 것과 비교하면 얼마나 효율적입니까?

값에 대한 조인을 만들거나 where 절에 특정 값 중 일부가 있어야 할 수도 있습니다. 일부 성능이 저하 될 수 있다는 우려가 있습니다. 필요할 때마다 중간 테이블을 만드는 것이 더 나을 수도 있습니다. 조인을 작성하십시오.

마지막으로 우리가 dbarray를 사용한다고 가정 할 때, 표준 django ORM을 가진 중간 테이블을 단순히 사용하는 것과 비교하여 효율성이 얼마나됩니까? (위의 질문에서 where 절은 조인이 없다고 가정)?

감사합니다

+1

나는 X가 1보다 커야한다고 생각하는 개발자 중 하나입니다. 배열과 데이터베이스는 일반적으로 나쁜 모조입니다 ... 그들은 더 이상 '자유 텍스트'필드가 아니므로 질의와 정렬이 실제로 저조합니다 특히 배열의 특정 값에 조인하려고하는 경우에 특히 유용합니다. SQL 작성을 결코 의도하지 않는다면 기본 데이터 저장소로 사용할 수있을 것입니다. 만약 당신이 그것에 대해 SQL을 쓰고 싶다면 ... 내가 여기 보이는 것은 테이블에서 어떤 필드를 저장하는지에 대한 유연성을 허용하는 이름 - 값 쌍 테이블로 이동하는 것이다.). – Twelfth

답변

3

PostgreSQL은이 같은 쿼리를 실행할 수있는 intarrays 이상 GINGiST 인덱스를 지원합니다

SELECT * 
FROM mytable 
WHERE myarray @> ARRAY[1, 2] 
-- returns arrays which contain 1 AND 2 

나이 :

SELECT * 
FROM mytable 
WHERE myarray && ARRAY[1, 2] 
-- returns arrays which contain 1 OR 2 

효율적입니다.

첫 번째 쿼리는 정규화 된 스키마를 사용하여 효율적으로 다시 쓰기 어렵습니다.