2017-10-31 7 views
0

Ich überlege gerade, wie ich meine DynamoDB-Tabelle (n) strukturiere.DynamoDB-Tabellenentwurf für monatliche Daten

Ich habe folgende Datenstruktur:

{ 
    UserId: string, 
    Id: string, 
    Date: string, //format: yyyy-mm-dd 
    From: string, 
    To: string, 
    Spent: string 
} 

So ist mein Ziel Stunden Arbeit zu speichern.

Ich werde durch UserId und Datum abfragen. So bekomme ich die Arbeitsstunden für den Benutzer, der angemeldet ist. Zum Beispiel: Abfrage für 2017-09-12.

Oder: Arbeitsstunden zwischen 2017.08.12 und 2017-09-30

Hash Key: UserId,

Sortierschlüssel: Id (Ich möchte nach Datum abfragen, aber Hash Key und Sort Key müssen eindeutig sein)

Secondary Local Index: Datum

Meine Frage: sollte ich spaltete die Tabelle in mehrere Monat getrennt Tabellen? Wenn ja: Es gibt keine Möglichkeit, mehrere Tabellen abzufragen. Also muss ich herausfinden, welche Tabellen von der Anfrage benötigt werden und sie einzeln abfragen und die Ergebnisse zusammenfügen?

Edit: Und die Tabellen muss ich automatisch auf den Fluss erstellen? Also muss ich überprüfen, ob die Tabelle bereits existiert und wenn nicht, werde ich sie in der Anfrage erstellen?

Ich beziehe den Amazon DynamoDB docs:

die Anwendungen uneben Zugriffsmuster über alle Elemente in der Tabelle zeigen könnte, wo die aktuellen Kundendaten relevanter und Ihre Anwendung ist vielleicht die neuesten Produkte mehr zugreifen häufig und im Laufe der Zeit wird auf diese Elemente weniger zugegriffen, und auf die älteren Elemente wird selten zugegriffen. Wenn dies ein bekanntes Zugriffsmuster ist, können Sie dies beim Entwerfen Ihres Tabellenschemas berücksichtigen. Anstatt alle Elemente in einer einzelnen Tabelle zu speichern, können Sie mehrere Elemente zum Speichern dieser Elemente verwenden. Sie könnten beispielsweise Tabellen erstellen, um monatliche oder wöchentliche Daten zu speichern. Für die Tabelle, die Daten aus dem letzten Monat oder der letzten Woche speichert, in denen die Datenzugriffsrate hoch ist, fordern Sie einen höheren Durchsatz an und für Tabellen, die ältere Daten speichern, können Sie den Durchsatz senken und Ressourcen einsparen.

Amazon DynamoDB Guidelines for Tables

Wenn Sie weitere Informationen benötigen, wenden Sie es sagen! Danke im Voraus!

Antwort

0

Ich werde Ihnen eine Option zur Verfügung stellen, wie Sie dies mit einer einzigen Tabelle implementieren. Hier vergleiche ich nicht Pros & Nachteile zwischen einzelnen und mehreren Tabellen (es ist außerhalb der Reichweite meiner Antwort). Ich ziehe es vor, mit einer einzigen Tabelle mindestens wegen zu gehen: 1) Preisfrage und 2) ist es möglich, Ihre Bedürfnisse mit einer einzigen Tabelle zu erreichen. Tabellenstruktur:

{ 
    UserId: String // hash key 
    Date: String // range key, format: yyyy-mm-dd 
    YearAndMonth: String //format: yyyy-mm, optional field 
    Events: List<Map<String, String>> // list of events, where single event - map with following keys: from, to, spent 
    Version: Long // for optimistic locking, @DynamoDBVersionAttribute 
    totalHours: Number // or maybe totalMinutes, optional field 
} 

Mit einem solchen Ansatz finden Sie alle Ereignisse für einen bestimmten Tag in einem einzigen Artikel einbetten. Also für jedes neue Paar 'Von & bis' sollten Sie dieses Ereignis zur Ereignisliste hinzufügen (wenn Element von Benutzer-ID & Datum ist nicht vorhanden => Sie erstellen ein neues, wenn vorhanden => Ereignisse Feld mit optimistischen Sperren sicher aktualisieren). Um die Arbeitsstunden zu berechnen, müssen Sie entweder das Feld Ereignisse analysieren oder ein weiteres Feld für die Tabelle wie totalHours hinzufügen (und diesen Wert bei jedem neuen Ereignis aktualisieren). Das YearAndMonth-Feld ist ein optionales Feld (Sie können es auch überspringen). Es könnte die Filterung vereinfachen, wenn Sie Stunden für alle Tage eines bestimmten Monats berechnen müssen.

+0

Vielen Dank für diese großartige Idee! Ich hätte nie über eine Event-Immobilie nachgedacht, um die Arbeitsstunden zu speichern. Deine Kommentare erwähnen den Weg für Java, richtig? Ich benutze NodeJs. So wäre Events einfach ein Array von Objekten mit den Eigenschaften from, to und expended. Weißt du, was in NodeJs gleich ist? – Lados

+0

Ja, ich erwähnte den Ereignistyp für Java. und für JS müssen Sie Array von Objekten verwenden, etwa 'var events = []; events.push ({ From: fromValue, To: toValue, ausgegebeneTime: verbrachteTimeValue }); ' –