Cassandra - Datenmodell für Time Series Data

Hallo zusammen,

ich grübel nun schon seit ein paar Tagen über einem Problem und ich hoffe dass mich hier jemand in die richtige Richtung schuben kann.

Wir sind momentan in der Planung zu einem Projekt, in dem unter anderem sehr große Mengen von Aktiendaten gespeichert werden sollen (Time Series Data). Die Daten fragen wir alle 15 Minuten von der Yahoo Finance API ab.
Nach etwas Recherche haben wir uns dann für Cassandra als Datenbank entschieden. Da ich mich bisher hauptsächlich mit relationalen Datenbanken beschäftigt habe tue ich mich beim erstellen des Datenmodells noch etwas schwer.

Zunächst sollen folgende Daten gespeichert werden:

  • Aktien ID (symbol)
  • timestamp (in Schritten von 15 Minuten)
  • Aktueller Wert der Aktie

Nachdem ich mir ein paar Texte und TechTalks angeschaut habe bin ich dem ganzen schon etwas näher gekommen denke ich. Aus den obigen Anforderungen würde sich wohl folgendes Schema ergeben:
[SQL]CREATE TABLE stock_data (
symbol text,
date timestamp,
value double,
PRIMARY KEY(symbol, date)
);[/SQL]
Um hotspots zu vermeiden würde man wohl den rowkey noch um den aktuellen Monat oder das aktuelle Jahr erweitern, aber das sei jetzt mal nicht so wichtig. Soweit findet man das ganze auch in TechTalks usw.
Aber wie erweitere ich das ganze nun um weitere Werte die ich speichern möchte (bspw. gehandeltes Volumen, Ask, Bid, …)? Ich habe oft gesehen, dass als value dann einfach serialisierte Daten (bspw. ein Json String) gespeichert wurden. Ist das noch aktuell? Oder kann ich einfach weitere Spalten hinzufügen?

Ich würde mir das in etwa so vorstellen:
[SQL]CREATE TABLE stock_data (
symbol text,
year int,
date timestsamp,
value double,
volume int,
ask double,
…,
PRIMARY KEY ((symbol, year), date)
);[/SQL]

Macht das so Sinn?

Was ist das Ziel?

Klar kann man Daten serialisieren und als BLOB oder JSON abspeichern.
Bei einem Passbild macht dies sogar noch weitgehend Sinn, da mir keine query einfällt um alle Personen anhand der Länge der Nasen zu sortieren. An dieser Stelle möchte ich eigentlich meist das Bild haben um es zu drucken oder anzuzeigen.

Wenn allerdings Abfragen auf diese Werte gemacht werden sollen, dann würde ich von einer Serialisierung abraten. Casandra bietet ja auch die Möglichkeiten das Datenmodel beliebig zu erweitern. Von daher würde ich den Weg über zusätzliche Spalten gehen um dann auch vernünftige Abfragen machen zu können.
Meine Glaskugel sagt mir, dass bei dieser Art von Daten meist auch die entsprechenden Auswertungen gemacht werden wollen.

Natürlich sollen die Daten nachdem sie gesammelt wurden auch ausgewertet werden.
Ich denke da fallen hauptsächlich folgende Queries an:

  • Gib mir den Wert der Aktie A zum Zeitpunkt X
  • Gib mir den Wert der Aktie A zwischen Zeitpunkt X und Y
  • Gib mir alle Daten der Aktie zwischen dem Zeitpunkt X und Y

Die Auswertung der Daten erfolgt dabei natürlich nicht in der Datenbank (durch geschickte Queries oder ähnliches), sondern in einer anderen Applikation. Von daher sollte das serialisieren der Daten nicht das größte Problem sein. Ich mache mir nur über folgende Dinge Gedanken:

So kann man sich die Struktur ja vorstellen. Im oben geschilderten Fall würde das bedeuten, dass der rowkey bspw. “YHOO-2012” ist, die Column Names wären Timestamps und die Column Values der Wert der Aktie zu dem Zeitpunt. Was genau passiert, wenn ich der Tabelle nun weitere Spalten hinzufüge? Es ist mir nicht klar wie das dann in das Schema im Screenshot passt.

Habe nochmal etwas weiter recherchiert und bin auf folgendes gestoßen:

Wie es scheint sorgt Cassandra schon dafür, das ganze passend abzulegen wenn man mit CQL arbeitet. Ich werde daher vorerst mal beim folgenden Modell bleiben:
[SQL]
CREATE TABLE stock_data (
symbol text,
year int,
date timestsamp,
value double,
volume int,
ask double,
…,
PRIMARY KEY ((symbol, year), date)
);
[/SQL]