2015-02-01 3 views
11

Ich bin neu bei DynamoDB (und im Allgemeinen zu noSQL) und ich kämpfe ein wenig um einige der Konzepte zu verstehen. Eine Sache ist insbesondere, mir einige Probleme zu geben, bei denen es darum geht, eine Tabelle basierend auf einem booleschen Schlüssel abzufragen.DynamoDB Abfrage auf booleschen Schlüssel

Ich weiß, dass ich keinen primären oder sekundären Index für einen booleschen Schlüssel erstellen kann, aber ich kann nicht sehen, wie ich idealerweise eine Tabelle mit der folgenden Struktur indizieren und abfragen sollte;

reportId: string (uuid) 
reportText: string 
isActive: boolean 
category: string 

Ich mag würde die folgenden Suchen in der Lage sein zu vervollständigen:

  1. Zugriff auf einen bestimmten Bericht direkt (ein primärer Hash-Index von reportId)
  2. Liste Berichte einer bestimmten Kategorie (ein primären Hash-Index auf Kategorie)

Dies sind beide einfach, aber ich möchte zwei weitere Abfragen durchführen;

  1. Liste aller Berichte, die
  2. als isActive = true
  3. Liste alle Berichte einer bestimmten Kategorie markiert sind, die markiert sind als isActive = true

Mein erster Ansatz wäre eine primäre Hashkey zu erstellen Index auf isActive, mit einem rangekey auf category, aber ich kann nur String, Number von als Schlüsseltyp wählen.

Speichern isActive als Zeichenfolge (gespeichert als "True" anstelle eines booleschen True) löst das Problem, aber es ist schrecklich mit einer Zeichenfolge für eine boolesche Eigenschaft.

Fehle ich etwas? Gibt es eine einfache Möglichkeit, die Tabelle direkt auf einen booleschen Wert abzufragen?

Alle Ratschläge gebührend gewürdigt.

Vielen Dank im Voraus.

Antwort

12

Mein Projekt enthält dieses spezielle Szenario und ich habe die bewährte Vorgehensweise von DynamoDB mit sparse indexes sowohl für lokale als auch globale sekundäre Indizes befolgt. Hier ist, was ich mit Ihrem Beispiel tun würde:

Table: reportId (string, hash key) || reportText (string) || isActive (string, marked as "x") || category (string) 

ActiveReportsIndex (Local Secondary Index): reportID (hash key) || isActive (range key) 

ActiveReportsByCategoryIndex (Global Secondary Index): category (hash key) || isActive (range key) || reportId 

Die Idee hinter reduzierter Indizes ist, dass nur Berichte als isActive markiert: „x“ in Ihren Indizes zeigen, so sollten sie weniger Speicherung und Verarbeitung benötigen, als Ihre Haupttisch. Anstatt das Attribut isActive zu einem booleschen Typ zu machen, der immer einen Wert true oder speichert, verwenden Sie eine Zeichenfolge wie "x" oder einen anderen Wert, wenn der Bericht aktiv ist, und DELETE das Attribut vollständig, wenn der Bericht nicht aktiv ist. Macht Sinn?

+2

Das ist perfekt und adressiert es nett. Ich habe die Referenz zu spärlichen Indizes nicht gesehen (und auch nicht den Link zu den Best Practices, den Sie enthalten), scheint aber genau das zu sein, was ich brauche. – fruvos

+2

Dies fühlt sich an wie eine Einschränkung für Dynamo, die Sie nicht basierend auf booleschen Werten abfragen können. Sie müssen sich mit Ihrer eigenen App-Logik befassen, um sie in boolesche Typen umzuwandeln. – Karthik

+0

Wie würden Sie eine Abfrage für den ActiveReportsIndex erstellen, um alle aktiven Berichte abzurufen? Wäre das nicht ein Scan auf diesem Index? –