0

우리 팀은 BigTable과 같은 객체 지향 데이터베이스에서 엔티티 관계 모델링 (특히 다 대다)의 확장성에 의문을 제기하는 GAE (Java)로 애플리케이션을 작성하고 있습니다.NoSQL/BigTable (GAE)의 무한 규모 관계를 모델링 할 수 있습니까?

App Engine Datastore에서 소유되지 않은 일대 다 및 다 대다 관계를 모델링하는 데 선호되는 솔루션 (Entity Relationships in JDO 참조)은 키 목록입니다. 그러나 구글은 경고 :

"이런 식으로 다 대다 관계를 구현하는 몇 가지 제한이 있습니다 첫째, 명시 적으로리스트가 있기 때문에 저장되는 컬렉션의 측면에있는 값을 을 검색해야합니다. 모든 당신 사용할 키 객체가 있습니다. 또 다른 더 중요한 일이 당신이 키 지나치게 큰 목록을 저장하지 않도록 할 이다 ... "키의

말하기 의 지나치게 큰 목록을, 당신이 시도하는 경우 이 방법으로 모델을 만들고 당신이 저장하고 있다고 가정하십시오. ne 각 키의 길이가 1MB 인 엔티티 당 한도를 초과하면 엔티티 당 이론적 최대 관계 수는 ~ 130k입니다. scalabililty가 주된 이점 인 플랫폼의 경우, 그다지 많은 관계가 아닙니다. 이제 130k 개 이상의 관계를 필요로하는 엔티티를 샤딩 할 가능성이 있습니다.

AppEngine 개발자 리소스의 데이터 저장소 마스터하기 시리즈의 일부로 다른 접근 방식 (관계 모델)이 Modeling Entity Relationships 문서에 설명되어 있습니다. . 그러나 모음의 연결을 통과하는 데이터 저장소에 더 많은 통화를 필요로하기 때문에 매우주의해야

" 사용하는 많은 이런 종류 : 그러나, 여기에 구글은 관계형 모델의 성능에 대해 경고 대다 관계는 사용자가 실제로 을 필요로 할 때만 가능하며 응용 프로그램의 성능에주의를 기울여야합니다. "

지금까지 묻는 질문 : '왜 엔티티 당 130k 개 이상의 관계가 필요합니까?' 글쎄, 네가 기쁘다. 의 예를 들어,와 CMS 응용 프로그램이 말을하자 1 백만 사용자 (이봐, 난 잘 꿈을 꿀 수?!)

콘텐츠를 업로드하고 함께 공유 할 수 있습니다

사용자 : 1. 공공 2. 개인 3. 그룹 (4) 어떤 조합이든지

이제 누군가가 로그인하고 어떤 그룹에서든 연결된 사람들의 새로운 업로드를 보여주는 대시 보드로 이동합니다. 이 대시 보드에는 공개 콘텐츠 및이 사용자 또는이 사용자가 속한 그룹과 구체적으로 공유되는 콘텐츠가 포함되어야합니다. 나쁘지 않니? 그것을 파헤 치자.

List<Long> idsThatGiveMeAccess = new ArrayList<Long>(); 
idsThatGiveMeAccess.add(myId); 
idsThatGiveMeAccess.add(publicId); //Let's say that sharing with 0L makes it public 
for (Group g : groupsImIn) 
    idsThatGiveMeAccess.add(g.getId()); 

List<Long> authorIdsThatIWantToSee = new ArrayList<Long>(); 
//Add a bunch of authorIds 

Query q = new Query("Content") 
      .addFilter("authorId", Query.FilterOperator.IN, authorIdsThatIWantToSee) 
      .addFilter("sharedWith", Query.FilterOperator.IN, idsThatGiveMeAccess); 

분명 내가 이미 깨진 한 몇 가지 규칙 :

public class Content { 
    private Long id; 
    private Long authorId; 
    private List<Long> sharedWith; //can be individual ids or group ids 
} 

이제 내 쿼리는 ID가 다음과 같을 수 볼 수 모든 것을 얻을 수 있습니다. 즉, 2 개의 IN 필터를 사용하면 성능이 저하됩니다. 우리가 말하는 한계에 근접한 모든 크기의 단일 IN 필터조차도 폭발 할 것입니다. 모든 것을 제외하고 결과를 제한하고 페이지를 넘기고 싶다고합시다. IN 필터를 사용하면 그렇게 할 수 없습니다.단일 쿼리에서이 작업을 수행하는 방법을 생각할 수 없습니다. 즉, 광범위한 읽기 시간 처리 및 여러 커서를 관리하지 않고도 페이지 매김을 수행 할 수 없다는 것을 의미합니다.

그래서 여기에 대해 생각해 볼 수있는 도구가 있습니다 : 비정규 화, 샤딩 또는 관계 엔티티. 그러나 이러한 개념을 사용하더라도이 데이터를 확장 할 수있는 방식으로 모델링하는 것이 가능한지 나는 알지 못합니다. 분명히 가능합니다. Google과 다른 사람들은 항상 그렇게합니다. 나는 어떻게 볼 수 없어요. NoSQL DB를 기반으로 한 cms 스타일의 액세스 제어를위한 좋은 리소스를 모델링하는 방법을 알려주는 사람이 있습니까?

답변

1

속성으로 ID 목록을 저장합니다. 각각의 새로운 관계에 대해 새로운 객체를 단순히 저장하지 않는 이유는 무엇입니까? (SQL 에서처럼). 해당 개체는 cms의 두 가지 속성을 저장합니다. 공유 항목의 ID와 사용자 ID. 1,000 명의 사용자와 공유하면 1000 개가됩니다. 주어진 사용자에 대해 쿼리하는 것은 간단합니다. 특정 항목이나 사용자가 공유 한 목록에 대한 권한을 쉽게 나열 할 수 있습니다.