2016-07-30 33 views
1

Es sei zu aktualisieren habe ich eine Tabelle Benutzer in Cassandras Userprincipal "genannt, wird das Repository so etwas wie dieWie mehrere Tabellen im Frühjahr CassandraRepository

public interface UserRepository extends CassandraRepository<UserPrincipal> 
{ 
    @Query("SELECT * FROM UserPrincipal WHERE email = ?0") 
    UserPrincipal findByEmailAddress(String emailAddress); 
} 

folgt aussehen Wenn ich mit Benutzername zum Beispiel die Tabelle abfragen müssen , Ich muss die Tabelle denormalisieren und ein Duplikat erstellen und nennen wir es UserPrincipalByUsername, das mit dem ersten identisch ist und nur mit dem Primärschlüssel, kann ich jetzt die folgende Schnittstelle als Repository verwenden? und was ist mit dem Speichern/Entfernen eines Benutzers zu/von beiden Tabellen gleichzeitig, um die Datenkonsistenz zu erhalten?

public interface UserRepository extends CassandraRepository<UserPrincipal> 
{ 
    @Query("SELECT * FROM UserPrincipal WHERE email = ?0") 
    UserPrincipal findByEmailAddress(String emailAddress); 

    @Query("SELECT * FROM UserPrincipalByUsername WHERE username= ?0") 
    UserPrincipal findByUsername(String username); 
} 

Es ist anzumerken, dass zwei separate Schnittstellen mit jeder Tabelle verwendet werden kann, allein zu bewältigen, aber immer noch, ich brauche eine gewisse Logik haben, um die Konsistenz zu einem bestimmten Zeitpunkt zu halten.

Ich bin mit Cassandra 2.0.11, CQL spec 3.1.1, Frühling Daten Cassandra 1.3.2 und Spring-Boot 1.3.1

+0

'UserPrincipal' und' UserPrincipalByUsername' sind unterschiedliche Tabellen? mit anderem Primärschlüssel? Sie können einen sekundären Index für 'UserPrincipal' erstellen, um den Namen zu verwenden, anstatt ihn zu desormalisieren? – Saravana

+0

In der Praxis können Sie den Cassandra-Index nicht für die Spalte mit hoher Kardinalität verwenden, was für den Benutzernamen der Fall ist. – Hasson

+0

Die Verwendung von '@ Query' wird Ihren Bedürfnissen entsprechen. Es ist Ihre Aufgabe, beide Tabellen synchron zu halten. Sie könnten atomare Batch-Operationen verwenden, aber diese sind ziemlich teuer, da sie Ihre Cassandra-Knoten beschäftigt halten. Wie wäre es mit einem Stapeljob, der außerhalb des Bereichs läuft und Aufräumvorgänge verfolgt/fehlende Daten hinzufügt? – mp911de

Antwort

0

Das einzige Verfahren, ich dies zu lösen gefunden, wie in der Frage erwähnt, Um zwei separate Schnittstellen für jede einzelne Tabelle zu verwenden, habe ich eine Wrapper-Klasse hinzugefügt, um beide mit save über einen Aufruf zu verwenden, aber das garantiert keine Konsistenz (z. B. bei einem Server-/Systemausfall)), aber das ist in meiner spezifischen Anwendung in Ordnung.