2017-11-14 1 views
1

현재 요청시 확장 기능이 필요한 데이터를 저장하기 위해 데이터베이스 패턴을 설계하려고합니다. 이 작업을 완료하려면 DynamoDB가 필요합니다. 나는 sql 디자인 패턴에 익숙하지 않고 디자인에 대해 약간의 문제가있다. 내 데이터 세트는 방에 들어서거나 나가는 사람들을 추적하는 카메라 시스템과 연결됩니다.DynamoDB 디자인 패턴

현재 디자인 계획에는 특정 카메라의 장치 ID가 기본 키인 테이블이 있습니다. 5 분마다 카메라는 총 수를 방에, 방 밖으로 총을, 그룹 ID (다중 출입구가있는 방 전체를 추적하기 위해) 및 타임 스탬프를 보냅니다.

내 문제는 DynamoDB가 지정된 기본 키에 대해 하나의 항목 만 원하는 것 같습니다. 새로운 추가 작업을 할 때마다 데이터를 덮어 쓰려고합니다.

I는 다음과 같은 설계가 작동 할 수 있다고 생각했다 :

DeviceID: ID 
{ 
    GroupID: ID, 
    Entries: [ 
     { 
      In: numIN, 
      Out: numOUT, 
      TimeStamp: time 
     }, 
     // appending on each entry to the list 
    ] 
} 

내가 비효율적 DynamoDB의를 사용하고? 이 문제를 해결할 더 좋은 방법이 있습니까? "얼마나 많은 사람들이 하루 x에 방 x에 있었나요?"와 같은 쿼리를 만드는 것처럼 보입니다. 어려울 것이다.

답변

1

이 데이터를 모델링하는 가장 좋은 방법은 1 대 다수 모델 인 것처럼 보입니다. 이렇게하면 DeviceID를 내 파티션 키로, 타임 스탬프를 내 정렬 키로 사용하게됩니다. 나머지 속성도 추가 할 수 있습니다. 정렬 키를 사용하면 백그라운드에서 정렬 된 해시가 파티션 키와 정렬 키의 조합이므로 동일한 파티션 키를 사용하여 여러 항목을 사용할 수 있습니다. 이 모델은 요청 된 시간 간격을 기반으로하는 데이터를 훨씬 간단하게 정렬합니다.

+0

실제로 이것은 더 간단한 해결책입니다. –

1

비효율적입니까?

아니요. 비효율적으로 사용하지 마십시오. DynamoDB는 요청 당 단일 요소에 대한 계층 적 데이터 그룹을 저장하고 검색하는 데 적합합니다. 제 견해로 설계 한 것처럼 조인 (엔트리 테이블과 장치 테이블)을 수행 할 수 없기 때문에 데이터를 중첩/역 정규화하여 하나의 장치에 배열이 포함되도록하는 것이 좋습니다. https://aws.amazon.com/blogs/database/should-your-dynamodb-table-be-normalized-or-denormalized/ 단점은 단일 장치에 대한 모든 항목을 가져와 추가해야하지만 5 분마다 업데이트를 허용하면 이것이 허용 될 것으로 보입니다. 사용자 트래픽이 적은 작은 앱에서 사용자 정보 목록에 추가 한 것과 동일한 작업을 수행 한 다음 사용자를 다시 배치합니다. DynamoDB는 요청 당 매우 저렴하므로 수백만 건의 요청이 없다면 제 의견에는 그만한 가치가 있습니다.

어떻게하면 더 복잡한 쿼리를 실행할 수 있습니까?

DynamoDB를 사용하면 일부 인스턴스에서는 관리가 100 % 저렴하고 요청 당 비용이 저렴합니다. 더 복잡한 쿼리의 경우 Global Secondary indexes을 추가하여 기본 데이터베이스 이외의 열과 관련된 쿼리를 실행할 수 있습니다 해당 테이블의 키. 그들은 자신의 단점도 가지고있다. 인덱스 당 2 개의 속성 만 가져올 수 있습니다. 기본적으로 2 개 열의 where 절과 각 GS 인덱스는 자체 프로비저닝 된 처리량을 가지므로 새 인덱스에 대해 추가로 고정 요금을 지불해야합니다. 내게있어, 글로벌 보조 인덱스는 조회하려는 데이터가 엔트리를 중첩하는 것과 비슷하게 비정규 화 될 때 실제로 도움이되지 않습니다. 귀하의 경우, "Entries"열이 문서 유형이기 때문에 in, out, timestamp 필드를 Global Secondary 색인에 적용 할 수 없습니다. 나 자신이 다른를 사용하지 않았다

복잡한 쿼리

에 대한 또 다른 데이터베이스있다 ... 당신이에 전체 장치 JSON 개체를 덤프 할 수 있지만 다른되는 NoSQL 데이터베이스는 그들은 지수도 중첩 된 필드 것 왜냐하면 내가 DynamoDB를 기본 또는 유일한 데이터 저장소로 사용할 수 있다고 생각했기 때문입니다.하지만 "A = 1 AND B = 2 AND C = 3"을 요구해야한다면 정말 불가능합니다. 데이터를 비정규 화하려고 시도하면서 친숙한 쿼리를 작성하는 것은 어렵다는 것을 알았습니다. 그래서 대신 DynamoDB를 사용하여 항목을 저장하고 항목을 검색하고 AWS Elasticsearch Service를 사용하여 해당 항목에 대해 쿼리를 실행합니다. 따라서 귀하의 경우 DynamoDB와 elasticsearch 모두에 중첩 항목이있는 장치를 저장합니다.개별 장치 나 항목을 검색해야하거나 ID로 아무것도 가져 오지 않으면 DynamoDB에서 가져옵니다. 어떤 자산에서나 분석을 실행하려면 elasticsearch를 사용합니다.

+0

자세한 답변을 보내 주셔서 감사합니다. DynamoDB를 사용하여 접근하는 방법에 대해 좀 더 자세히 설명합니다. 그래서 당신은 데이터를 끌어 내고, 새로운 데이터를 추가 한 다음 다시 데이터베이스에 넣을 것을 제안하고 있습니까? 이전에 저장된 데이터를 가져 오지 않고 새 데이터를 추가하는 방법이 있습니까? –

+1

@AlexDeCamillo 맞습니다. 나는 PUT이나 POST가 뒤 따르는 GET을하지 않고 추가 할 방법을 모르고있다. DynamoDB가 노출하는 REST API의 제한 사항이라고 생각합니다. 이 문제를 해결할 방법을 찾으면 알려주지 만 나는하지 못했습니다. –

+0

데이터 정규화에 대해 몇 가지 질문이 있습니다. timestamp 속성을 만드는 것이 더 좋은 해결책일까요? 그리고 나서 in/out 데이터는 그 속성 안에 있습니다. 나는 많은 수의 속성을 가질 것이지만, 당연히 당길 필요없이 그 시점에 추가 할 수 있습니다. 이렇게하면 더 빨리 검색 할 수도 있습니다. 또한 정규화에 관해 게시 한 링크에서 동일한 파티션 키가있는 항목이 여러 개인 경우를 예로들 수 있습니다. DynamoDB에서 이것이 가능하지 않다고 생각했습니다. –