2012-11-30 3 views
5

나는이 구조를 가진 PostgreSQL 데이터베이스와 루비 레일에 응용 프로그램을 . 각 A에는 수천 개의 B가 있고 각 B에는 수만 개의 C가 있습니다 (따라서 각 A에는 수백만 개의 C가 있음).수평 데이터베이스 확장

A는 독립적이며 다른 A의 B 's와 C는 함께 필요하지 않습니다 (즉 동일한 쿼리에서).

내 문제는 이제 ActiveRecord 쿼리가 꽤 오래 걸린다는 것입니다. C 용 테이블에 수천만 개의 행이 있으면 쿼리에 오래 걸릴 것입니다.

데이터베이스를 수평으로 확장하려고합니다 (즉, A의 테이블, B의 ​​테이블 하나, 각 A의 C 테이블 하나). 그러나 나는 그것을 어떻게하는지 모른다. 그것은 일종의 sharding 일종이지만 DB 테이블을 동적으로 생성하는 방법을 알아낼 수 없으며 ActiveRecord를 사용하여 테이블이 어떤 A im과 작업하는지에 따라 데이터에 액세스 할 수 있습니다.

대단히 감사합니다.

+1

확인

http://www.mongodb.org/

'public'. – tadman

+0

감사합니다. 나는 스키마에 대해 몰랐습니다. 그러나 나는 어떻게 그것을 동적으로 할 것이냐? – Nicolas

+0

만약 내가 당신이라면, 당신에게 시작할 곳을 제공하는 부가 기능이나 플러그인을 찾아 볼 것입니다. Postgres 공간에 익숙하지는 않지만 점프 지점 역할을 할 수있는 [Octopus] (https://github.com/tchandy/octopus)와 같은 것들이 있습니다. – tadman

답변

2

소수 행 또는 몇 백만 행의 성능 문제가있는 경우 솔루션을 대기업에 적용하기 전에 조치를 취해야합니다. 설명하는 문제는 색인 생성을 통해 쉽게 해결할 수 있습니다. 추가적인 물리적 테이블을 만드는 데 이점이 없으며 놀라운 복잡성을 도입하게됩니다.

@ mu-is-too-short 이미 언급했듯이 : 쿼리 계획에주의하십시오. 도구를 사용하여 실적을 분석하십시오.

table partitioning은 물리적으로 그리고 투명하게 데이터를 다른 샤드 테이블에 저장하는 데 사용할 수 있으며 이는 매우 빠르게 증가하지만 특정 시간 상자 (예 : 한 달)에만 유용합니다. 또한 아카이브 비트 플래그 열을 사용하여 오래된 레코드 또는 삭제 된 레코드를 더 느린 스토리지 (예 : 방적 녹이 포함 된 표준 RAID)로 셔틀하면서 빠른 스토리지 (SSD RAID와 같은)에 활성 레코드를 유지할 수 있습니다.

+0

고맙습니다. 색인 생성으로 문제가 해결되었다고 할 때 당신은 무엇을 의미합니까? 현재 C의 색인은 B가 속한 B와 연결되는 색인을 가지고 있으며, A는 B의 경우 A와 관련되어 있습니다. – Nicolas

+0

테이블에 인덱스가있는 경우에도 수백만 행이 비교적 빨리 반환되어야합니다. 오래된 하드웨어를 사용하지 않는 한 "절대로 길지 않습니다". 실험으로 Navicat와 같은 도구를 사용하여 ActiveRecord에서 실행되는 SQL 문을 실행합니다. ActiveRecord는 생각하는 것이 아니며 종종 AR의 성능과 비교합니다. 당신의 log/development.log를 꼬집어 N + 1 쿼리 성능에 빠지면 (실수로 조인을 제외시킴으로써)보십시오. 어떤 종류의 in-process 요구 사항이 작동하려면 수백만 행이 필요한지 궁금합니다. MM + 행 조작은 일반적으로 proc에서 벗어납니다. – cfeduke

0

그래서 나무와 같은 구조로 보입니다. 어떤 종류의 교차 참조 방식으로 데이터베이스에서 가져올 필요가 없다면, A는 정확히 "문서"의 속성을 가지고 있습니다. MongoDB를 살펴보십시오. A 's는 B와 B 모두로 저장되며 거기에는 C가 하나의 레코드로 저장됩니다. 당신이 ORM을 찾고 있다면, 당신이 할 경우, 당신은 당신이에 kajillion 테이블을하지 않도록 다른 스키마로 분할 할 수 있습니다

http://mongoid.org/en/mongoid/index.html

+0

감사합니다! 나는 NoSQL에 대해 생각하지 않았다. 어쩌면 그게 내가 무엇을 찾고 있는지에 대한 것이다. – Nicolas

+1

Mongo를 사용한다면 쓰기 성능 문제가있다. 2.2 이후 글로벌 잠금이 사라졌다. (나는 2.0 이후로 사용하지 않았다) 그래서 어쩌면 그것도 한번은 그렇게 나쁘지 않았습니다. 또한 중복성을 고려해야합니다. 10gen은 확장 된 중복 환경을 위해 최소한 6 개의 다른 물리적 호스트에있는 VM을 권장합니다. 기본 데이터 저장소를 변경하기 전에 데이터를 비정규 화하는 것을 두려워하지 마십시오. 또한 PostgreSQL에는 NoSQL 대안 인 Hstore가 있습니다. – cfeduke

관련 문제