2016-06-20 7 views
0

Ich versuche, eine neue Anwendung zu entwerfen, die Cassandra anstelle einer traditionellen SQL-Datenbank verwendet. Die Clustering- und horizontalen Skalierungsfunktionen sind besonders nützlich für meinen Anwendungsfall.Speichern von flexiblen Schema in Cassandra

Ich habe diese Situation, wo ich mehrere Datensätze habe, die sich sehr voneinander unterscheiden könnten. Wenn ich zum Beispiel verschiedene Sportinformationen speichere, würde ich für Fußball Dinge wie die beiden Mannschaften, die Spieler, die Ergebnisse nach der Halbzeit und die volle Zeit, rote Karten, gelbe Karten usw. speichern, während es bei einem Tennisspiel sein würde Dinge wie die zwei Gegner, Anzahl der Sätze, etc.

Ich möchte keine Tabelle für jede Sportart haben (es gibt Lasten), und will in der Lage sein, neue Sportarten hinzuzufügen, ohne die Datenbank jedes Mal ändern zu müssen . Ich möchte es flexibel halten, wo diese Informationen sich je nach Sportart des Datensatzes beliebig ändern können.

Wie ist es am besten, diese Art von Informationen in Cassandra zu modellieren? Ich weiß, dass es keine "Dokument" -orientierten Datenbanken wie MongoDB usw. ist, aber für den Rest der Anwendung ist die "tabellenartige" Struktur, die Cassandra anbietet, ideal.

Ich weiß, ich kann es einfach als JSON-Zeichenfolge in einem Textfeld speichern und auf Anwendungsebene verarbeiten, aber ich befürchte, dass dies die zukünftige Anforderung zur Massenabfrage der Felder innerhalb der JSON-Zeichenfolge (z. B. alle Übereinstimmungen) begrenzt das hatte einen bestimmten Schiedsrichter).

Ich weiß, dass es eine andere Alternative gibt, um es als eine Karte zu speichern. Indizes scheinen jedoch ein wenig begrenzt zu sein, alle Beispiele scheinen den Index basierend auf dem Kartenschlüssel zu finden, nicht auf dem Wert. Und einige Leute scheinen auch die Verwendung von Indizes in Google Maps zu verhindern.

Welche Optionen habe ich?

+0

Wenn die Frage ist "Welche Optionen habe ich?" dann hast du es schon beantwortet. – OrangeDog

+0

Ich würde vorschlagen, Cassandra als Schlüsselwert (was es wirklich ist) und nicht als "Tisch-Like". Beachten Sie auch, dass Sie keine Karten verschachteln können, aber wenn Sie undurchsichtige JSON-as-Text-Felder verwenden. – OrangeDog

+0

@OrangeDog Die JSON-Struktur kann tatsächlich flach sein, das ist also kein Problem. Meine Frage ist eher, ob ich mit Hilfe einer Karte einen gefährlichen Weg fahren werde, ob es irgendwelche Nachteile gibt, über die ich nicht gelesen habe, und ob es andere Möglichkeiten gibt. – jbx

Antwort

0

Ich hatte das gleiche Problem. Einfacher kurzer Trick: Sie erstellen eine Spalte für den Schlüssel und eine Spalte für den Wert. Manchmal können Sie es auch mit einer statischen Spalte verwenden.

Like:

CREATE TABLE gameOverview (
     sportType text, sportPropertyIndex1 text static, sportPropertyIndex2 text static, sportPropertyIndex3 text static, 
     sportPropertyValue1 text, sportPropertyValue2 text, sportPropertyValue3 text, 
     PRIMARY KEY(sportType, sportPropertyValue1, sportPropertyValue2, sportPropertyValue3) 
    ) 

Statische Spalten sind in der Partition statisch. Manchmal können Sie keine statische Spalte verwenden, da die Partition sonst zu groß wäre. (Sportart könnte zu groß sein). Verwenden Sie dann keine statische Spalte, aber seien Sie vorsichtig mit diesen Spalten in Ihrer Anwendung.

/e Warum habe ich das anstelle einer Karte verwendet? Sie können auch Wertindizes erstellen, es handelt sich jedoch nur um einen sekundären Index. Aber wie Sie wissen, ist die Leistung eines Sekundärindex nicht der Beste. Mit dieser Lösung können Sie die Vorteile eines primären Index nutzen, aber Sie haben auch die Flexibilität einer Karte.

+0

Aber in diesem Fall bin ich nicht manuell die Eigenschaftsschlüssel fest codieren? Einige haben vielleicht 20 Felder, während andere 30 verschiedene Felder haben können. Ich möchte vermeiden, alle Felder zu erstellen. Wenn ich zum Beispiel eine relationale Datenbank verwenden würde, könnte ich eine separate Eins-zu-Viele-Tabelle namens "game_info" mit 3 Feldern, der Spiel-ID, dem Schlüssel des Attributs und dem Wert haben, und ich würde ein 'select * from machen game_info wo game_id = 1'. Wenn ich alle Felder indexiere, könnte ich einige Join-Tricks verwenden, um alle Spiele im Stadion XYZ zu spielen. – jbx

Verwandte Themen