2012-08-04 2 views
0

Dynamo 나 Mongo 등과 같은 NoSQL 저장소에 대한 이해는 비정규 화의 관점에서 생각하고 수행 할 쿼리를 기반으로 테이블을 작성해야한다는 것입니다.이 방법이 DynamoDB의 테이블 작성에 적합한 방법입니까?

테이블을 어떻게 설정해야하는지 고심하고 있습니다.

실행하고 싶은 쿼리를 식별했습니다. 나는에 정상적인 SQL 쿼리 어떻게 될지 번역 한

예를 들어, 내가 실행하려는 쿼리로 이렇게 번역 것 '일반 영어'

"모든 사진이 date_x 사이에하기 나는 이것이 내가 생각 해낸 것입니다, 테이블 조인 할 수 없기 때문에 사진 작가가 존 가장 많은 표 "

에 의해 정렬됩니다 date_y는 :

photos 
{ 
    name, 
    url, 
    photographer, 
    date_created, 
    likes, 
    dislikes, 
    num_voters, 
    weighted_score 
} 

는 일이다 올바른 접근법인가?

좋아요, 싫어요, num_voters 및 weighted_score가있는 이유는 사용자가 사진에 투표 할 때마다 "행"을 업데이트하고 좋아요/싫어요/num_voters를 증분하고 다시 계산해야하기 때문입니다. 내가 '필터'를 적용하고 있기 때문에

,

을 (유권자의 수가 적은 높은 평가 항목 내 리더 영향을주지 않습니다 있도록) weighted_score는 - 디나모가 아닌 것처럼 키/값 저장소를 가정 내가 원하는거야?

또 한 가지 질문 : 사진사 테이블이 있다고 가정 해 사진 작가를 삭제하고 싶습니다. 사진을 찍고 사진 작가가 삭제하는 것은 내 책임입니까? 다시 말하지만, 관계형이 아니기 때문에 계단식 유형 기능이 없다고 가정합니다.

답변

1

DynamoDB의

감사는 현재 기본 키뿐만 아니라 각 테이블에 대한 범위 키를 정의 할 수있는 인덱스 키 - 값 데이터베이스입니다. 유연한 쿼리 예제에는 적합하지 않으므로 여러 속성으로 검색하면 non-indexed table scans이됩니다.

MongoDB는 여러 개의 인덱스를 정의 할 수있는 문서 지향 데이터베이스이며 사용 사례에 더 적합합니다.

예 : "사진 작가가 대부분의 투표로 주문한 date_x와 date_y 사이에서 찍은 사진 모두 가져 오기".

db.photos.find({ 
    'photographer': 'john', 
    'created': { 
     $gte: ISODate("2012-07-01"), 
     $lte: ISODate("2012-07-05") 
    } 
}).sort({'votes': -1}); 

등 좋아하는/싫어하는/투표 수로 카운터를 증가 들어, Atomic Operations를 참조하십시오.

비 관계형 데이터베이스의 계단식 삭제가 지원되지 않는 (또는 관련성이 있음) 것이 맞습니다. 관련 문서를 삭제하여 응용 프로그램 계층에서이 논리를 지원할 수 있습니다. 일부 MongoDB 드라이버는 관련 문서를 가져 오는 데 유용 할 수있는 Database References (DBRefs)이라는 개념을 지원합니다. DBRef를 사용하면 여전히 여러 개의 쿼리가 발생하지만 유용한 도우미가 될 수 있습니다.

+0

감사합니다. Stennie! – john

관련 문제