2017-07-15 3 views
2

hinzugefügt Ich habe Cassandra Tabelle wie untenerlaubt Bedarf Zugriff auf Cassandra Filtering werden

create table user(
id UUID PRIMARY KEY, 
firstname varchar, 
secondname varchar, 
emailid varchar, 
); 

Von Java - Frühling Boot im Daten versuchen

Optional<User> findByEmailid(String emailId); 

ich Fehler

besagt, erhalten Zugriff auf

Es fordert mich auf, den Teil "FILTERING ALLOWED" der Abfrage zu verwenden. Gibt es das überhaupt, um dies global zu ermöglichen oder sollte ich die Abfrage/db-Struktur ändern?

Antwort

1

Dieser Fehler besagt, dass emailid keine gültige Spalte ist, die in Ihrer WHERE-Klausel gefiltert werden kann. Die Aktivierung von ALLOW FILTERING oder das Erstellen eines sekundären Index für diese Spalte ist eine Möglichkeit, dies zu tun. Aber beides sind ziemlich schreckliche Lösungen (weil Cassandra unter der Haube funktioniert).

Mit Cassandra müssen Sie einen abfragebasierten Modellierungsansatz verwenden. Dies bedeutet, dass Abfragen und Tabellen manchmal (oft) ein Verhältnis von 1: 1 haben. Wenn Sie wirklich Benutzer nach E-Mail-Adresse abfragen müssen, müssen Sie eine Tabelle erstellen, um diese Abfrage zu bedienen.

CREATE TABLE user_by_email(
    id UUID, 
    firstname varchar, 
    secondname varchar, 
    emailid varchar PRIMARY KEY, 
); 

Dann so etwas wie dies funktioniert:

Optional<UserByEmail> findByEmailid(String emailId); 

Und wenn Sie nicht immer auf der Abfrage die user Tabelle planen von id, dann gibt es wirklich keinen Grund, diese Spalte zu verwenden, wie Ihr einziger Primärschlüssel.

+0

Bedeutet es, dass ich immer mit PRIMARY KEY abfragen sollte? Ich kann nicht mit anderen Spalten filtern? – syv

+0

@syv korrekt. Sie müssen Ihre Primärschlüssel immer mit den Spalten erstellen, für die Sie Abfragen durchführen möchten. – Aaron

+0

Danke. Ich hatte das Design im Detail durchgespielt, es gibt drei Optionen, die vorgeschlagen wurden. 1. Ich muss das Datenmodell erneut betrachten. 2. Erlaube Filter 3. Index hinzuzufügen. – syv

Verwandte Themen