2012-12-17 2 views
1

대규모로 커지는 내 애플리케이션의 데이터베이스 (MySQL)에 조인 테이블이 있습니다.대규모 테이블 조인

두 개의 모델 사용자 및 제품이 있으며 사용자는 여러 제품을 볼 수 있으며 제품은 여러 사용자가 볼 수있는 방법을 가지고 있습니다.
on start 모든 사용자는 모든 제품을 볼 수 있으며 사용자는 볼 수있는 제품을 수정할 수 있습니다.

테이블 크기가 (n * m)이 될 n은 사용자 수 (큰 수)이고 m은 제품 수 (너무 큼)이며 테이블 읽기 작업이 느려질 것입니다.

예 : 나는 3 사용자들은 아이디의이 : 그래서 users_products 테이블이 될 것 "1,2,3"

:

"1,2,3"
3 제품에 자신의 아이디의를

USER_ID, PRODUCT_ID
1,1-
1,2
1,3-
2,1
2,2 01,238,007, 2, 3
3, 1
3, 2
3, 3

나는 다른 데이터베이스 시스템을 사용하려면이 부분을 재 설계부터 모든 솔루션 열려있어.

미리 감사드립니다.

+1

"테이블의 읽기 작업이 느려집니다." 왜 그것이 느릴 것이라고 생각하니? 이 주장을 뒷받침 할 경험적 증거가 있습니까? 색인 추가를 시도 했습니까? –

+1

귀하의 아이디어는 고전적인 솔루션입니다.이 테이블에는 2 개의 필드 만 있으며 'user_id'열에 대한 색인은 빠른 결과를 산출한다는 것을 기억하십시오. – Moka

+0

@EranBane : 레코드가 단지 2 정수이고 그만큼의 공간을 차지하지 않을 것이라는 것을 알고 있지만, 앞으로 문제를 예방하기 위해이 지점을 조사 중입니다. – Aboelnour

답변

1

나는 아마도 당신이 생각하는 무언가는 사실이 아니라고 생각합니다. SQL 서버는 많은 행이 있더라도 이러한 종류의 쿼리를 사용하면 빠릅니다. 좋은 인덱스가 있다면 천만 개의 레코드가있는 테이블을 매우 빠르게 쿼리 할 수 ​​있습니다.

모든 종류의 조기 최적화를 수행하기 전에 몇 가지 테스트를 수행하는 것이 좋습니다.

0

Neo4J를 들여다 보았습니까? 내 생각에이 특별한 사용 사례에 완벽하게 잘 설명되어있는 그래프 데이터베이스입니다. 이것을 모델링하는 방법은 매우 쉽습니다.

모든 사용자와 모든 제품은 노드로 표시됩니다. 둘 사이에 관계 "IS_ABLE_TO_SEE"를 만들거나 그렇지 않습니다.

그런 다음 전체 기능 범위를 사용하여이 데이터를 다시 검색 할 수 있습니다. 내 마음에 드는 것은 노드에서 시작하는 탐색 (traversal)의 사용입니다. 관계를 처리하면 (어떤 코드를 통해 어떤 방향으로 걷는 지 선택할 수 있습니다). 그러나이 방법은 서로 깊이가있는 여러 수준의 데이터를 검색하는 데 더 유용합니다.

우리의 특별한 사용 예에서는 관계 "IS_ABLE_TO_SEE"를 통해 사용자 노드에 연결된 모든 제품 노드를 반환하는 간단한 쿼리를 수행 할 수 있습니다.

Neo4J는 그래프 데이터베이스에 대한 경험이없는 사람들에게 매우 쉽게 접근 할 수 있으며, 내가 말했듯이 여기에 제시된 유스 케이스를 위해 제작되었습니다.

0

Pieter-Jan은 Neo4J를 사용하여 다른 솔루션을 지적 했으므로 Couchbase와 Neo4J를 모두 좋아합니다. 이것은 단순한 목록이며 관계형 테이블은 이러한 조작에 적합하지 않습니다.

Couchbase에서는 여러 가지 방법을 사용할 수 있습니다. 하나는 간단한 client.append를 사용하여 제품 목록을 유지 한 다음 하나의 client.get을 사용하여 목록을 검색하는 것입니다. 여기에는 두 가지 가능성이 있습니다. 추가하기 전에 중복 제거하거나 중복 제거 할 수 있습니다. 목록을 확보하는 데 매우 빠르며 어떤 형태의 쿼리도 제거합니다.

또 다른 방법은 JSON을 사용하고 사용자가 액세스하고 볼 수있는 각 제품의 배열을 갖는 것입니다. 첫 번째 예에서 위의 간단한 문자열과 동일하지만 Map/Reduce on을 사용할 수 있습니다 필요한 경우 JSON에있는 경우

두 경우 모두 어떤 유형의 쿼리보다 성능이 우수합니다.