2014-11-19 4 views
2

클래스 및 클러스터를 사용하여 다음을 디자인하고 싶지만 가장 논리적이고 효율적인 솔루션을 찾고 있습니다.OrientDB 클래스/클러스터 디자인

기본적으로 사용자 3 가지 유형 (매우 다른) 그래서 사용자 추상 클래스를 확장하는 클래스로 디자인했습니다.

내 앱은 GeoLoc을 기반으로합니다. 그래서 위해서는 응답 시간 속도의 문제에 최상의 사용자 경험을 제공하기 위해 나는이 방법을 사이에 주저하고있어 (등 스캔 .. 수행 할 때) :

  1. 각 UserType을 위해 수만큼의 클러스터를 갖는 그런 다음 해당 클러스터를 대상으로 선택하십시오.

          _______________________ 
              | User (abstract class) | 
              |_______________________| 
                ^
                 | 
                 | 
    ___________________   ___________________   ___________________ 
    | UserType1 (class) |  | UserType2 (class) |  | UserType3 (class) | 
    |___________________|  |___________________|  |___________________| 
          |       |       | 
          |       |       | 
        US-Cluster_1    US-Cluster_2    US-Cluster_3 
        FR-Cluster_1    FR-Cluster_2    FR-Cluster_3 
        UK-Cluster_1    UK-Cluster_2    UK-Cluster_3 
    
  2. 후 여과하여 사용자가 선택한 각 UserType을위한 countryField 데.

          _______________________ 
              | User (abstract class) | 
              |_______________________| 
                ^
                 | 
                 | 
    ___________________   ___________________   ___________________ 
    | UserType1 (class) |  | UserType2 (class) |  | UserType3 (class) | 
    |     |  |     |  |     | 
    | - countryField |  | - countryField |  | - countryField | 
    |___________________|  |___________________|  |___________________| 
    

    다음

Select * from UserType1 where countryField = "US"은 무엇 가장 효율적이고 논리적 인 방법이 될 것이다?

감사합니다.

답변

2

부분적으로 기록 개수 및 원하는 응답 시간에 따라 다릅니다. 우리의 경험에서 데이터를 클러스터로 분리하는 것은 복잡성 (클러스터, 다른 쿼리 등을 관리)을 희생하면서 쿼리 시간을 크게 향상시킵니다. 우리는 각 클러스터에 2 백만 개의 레코드를 저장하고 집에서 만든 인덱스를 추가하여 쿼리 시간을 빠르게 만듭니다.

실제로 테스트 데이터를 생성하고 쿼리 성능과 요구 사항을 테스트하는 두 가지 방법으로 저장해야합니다. 2 가지 유스 케이스는 동일하지 않습니다.

+0

감사합니다. 나는 그렇게 할 것이다. 'No 2 유스 케이스가 똑같은가? '라는 말은 무엇을 의미합니까? – Copernic

+0

우리가 우리의 데이터를 저장/쿼리/사용하는 방식이 당신이하는 것과 같지 않거나 다른 것입니다. – 8forty

1

클러스터 내에서 수백만 개의 레코드가 증가하면이 스레드 [1]에 따르면 orient db는 특히 클러스터에서 레코드를 검색 할 때 인덱스를 사용할 수 없기 때문에 클러스터 내부에서 레코드를 검색하는 데 문제가 있습니다.

나중에 클러스터 내에서 레코드 수가 증가하면 데이터 검색 시간을 단축하기 위해 다른 필드 (예 : townField)에 대한 인덱스를 만들려면이를 수행 할 수 없습니다. 그러므로 남은 유일한 해결책은 마을에 의해 그들을 다시 모으는 것입니다.

따라서 두 번째 접근법을 사용하고 인덱스를 효과적으로 사용하거나 클래스 db가이 스레드 [1]에서 제안하는대로 클래스 상속 기반 솔루션을 사용해 보시기 바랍니다.

참조 [1] https://github.com/orientechnologies/orientdb/issues/4606