2012-02-03 4 views
43

데이터베이스 서버를 유지 관리하고 확장하는 번거 로움을 덜어 준 것처럼 Amazon의 DynamoDB를 보았습니다. 현재 MySQL을 사용하고 있으며 데이터베이스를 유지 관리하고 확장하는 것은 완전히 골치 거리입니다.DynamoDB를 어떻게 쿼리합니까?

필자는 설명서를 읽은 후 쉽게 검색 할 수 있도록 데이터를 구조화하는 방법에 대해 고민하고 있습니다.

전적으로 NoSQL 및 비 관계형 데이터베이스를 처음 사용했습니다.

Dynamo 설명서에서 기본 해시 키의 테이블과 비교 연산자의 수가 제한된 기본 범위 키만 쿼리 할 수있는 것처럼 들립니다.

또는 전체 테이블 스캔을 실행하고 필터를 적용 할 수 있습니다. 한 번에 1Mb 만 스캔하므로 스캔 결과를 찾기 위해 스캔을 반복해야 할 수 있습니다.

나는 이러한 제한 사항으로 인해 예측 가능한 성능을 제공 할 수 있음을 알고 있지만 실제로 데이터를 가져 오는 것이 어렵다고 생각합니다. 전체 테이블 스캔을 수행하는 것은 실제로는 비효율적 인 것처럼처럼 보이며 테이블이 커질수록 시간이 지남에 따라 효율성이 떨어집니다.

인스턴스의 경우 Flickr 복제본이 있다고 가정 해보십시오.

  • 이미지 ID (번호, 주 해시 키)
  • 추가 날짜 (숫자, 기본 범위 키)
  • 사용자 ID (문자열)
  • 태그 (문자열 설정 : 내 이미지 테이블 같은 것을 보일 수 있습니다)

그래서 최근 7 일 모든 이미지를 나열하고 아주 쉽게 결과의 X 번호를 제한 할 수있을 것 쿼리를 사용.

그러나 특정 사용자의 모든 이미지를 나열하려면 전체 테이블 스캔을 수행하고 사용자 이름별로 필터링해야합니다. 태그도 마찬가지입니다.

그리고 한 번에 1Mb 만 스캔 할 수 있기 때문에 X 개의 이미지를 찾으려면 여러 번 스캔해야 할 수 있습니다. 나는 또한 X 번호의 이미지에서 쉽게 멈출 수있는 방법을 보지 못했다. 30 개의 이미지를 얻으려고하면 첫 번째 스캔에서 5가 검색되고 두 번째 스캔에서 40을 찾을 수 있습니다.

이 권리가 있습니까? 기본적으로 트레이드 오프입니까? 사실상 유지 보수가 필요없는 매우 빠른 예측 가능한 데이터베이스 성능을 얻을 수 있습니다. 그러나 결과를 처리하기 위해 더 많은 논리를 구축해야한다는 점에서 절충점이 있습니까?

아니면 여기에서 완전히 벗어나나요?

답변

16

예, 당신은에 대한 올바른 성능과 쿼리 유연성 사이의 균형.

그러나 고통을 줄이기위한 몇 가지 트릭이 있습니다. 보조 색인/비정규 화가 아마 가장 중요합니다.

예를 들어, 사용자 ID에 키를 입력하고 모든 이미지를 나열하는 테이블을 만들 수 있습니다. 이미지를 추가 할 때이 테이블을 업데이트 할뿐만 아니라 이미지 ID를 사용하여 테이블에 행을 추가합니다.

필요한 쿼리를 결정한 다음 해당 데이터 모델 주위에 데이터 모델을 디자인해야합니다.

+0

좋습니다. 어떻게 태그 같은 것을 할 수 있을까요? 기본 키가 태그 이름이되고 범위 키가 이미지 ID가됩니까? 기본 키가 String Set이 될 수 없다고 가정합니다. – chriserwin

+0

맞아요.하지만 DynamoDB의 세부 사항에 익숙하지 않습니다. 대신 Cassandra와 함께 일했습니다. – DNA

+0

zend에서 DynamoDB를 처음으로 쿼리하면 3 초가 걸립니다. 그런 다음 다른 쿼리를 실행하는 데 1 초도 걸리지 않습니다. 이것에 대한 이유는 무엇일까요? – keen

6

다른 테이블을 사용하여 보조 색인을 직접 만들어야한다고 생각합니다.

이 표 "스키마"수 :

User ID (String, Primary Key) 
    Date Added (Number, Range Key) 
    Image ID (Number) 

-

당신이 날짜로 사용자 ID 및 필터 조회 할 수 있습니다 방법뿐만 아니라

4

복합 해시 범위 키을 기본 인덱스로 사용할 수 있습니다. DynamoDB의 페이지

:

기본 키는 어느 단일 속성 해시 키 또는 복합 해시 키 범위 일 수있다. 단일 속성 해시 기본 키는 의 경우 "UserID"일 수 있습니다. 이렇게하면 지정된 사용자 ID와 연관된 항목에 대해 데이터 을 빨리 읽고 쓸 수 있습니다.

복합 해시 범위 키는 해시 키 요소와 범위 키 요소로 인덱싱됩니다. 이 다중 부분 키는 사이의 계층 구조를 유지하면서 첫 번째와 두 번째 요소 값을 유지합니다. 예를 들어, 복합 해시 - 범위 키는 "UserID"(해시)와 "Timestamp"(범위)의 조합 일 수 있습니다. 해시 키 요소를 상수로 유지하면 키 요소 전체에서 항목을 검색 할 수 있습니다. 은 Query API를 사용하여 예를 들어 에 대한 모든 항목을 타임 스탬프 범위에서 단일 UserID로 검색 할 수 있습니다.

관련 문제