2016-01-03 2 views
1

Dans cet exemple:Recherche dans le type défini par l'utilisateur avec Apache Cassandra

CREATE TYPE address (
    street text, 
    city text, 
    zip_code int, 
    phones set<text> 
) 

CREATE TABLE users (
    id uuid PRIMARY KEY, 
    name text, 
    addresses map<string, address> 
) 

Comment puis-je interroger les utilisateurs avec city = newyork ou trouver un utilisateur avec un numéro de téléphone spécifique.

+0

Je suis d'accord avec la réponse acceptée que vous devriez envisager de refaire votre modèle de données d'une manière plus optimale pour Cassandra. Plus généralement, l'intégration de Cassandra à Apache Solr permet d'interroger des champs clés non primaires, y compris des types définis par l'utilisateur: http://docs.datastax.com/en/latest-dse/datastax_enterprise/srch/srchUDT.html (link is un guide pour configurer les UDT dans Solr pour le bundle DataStax Enterprise Cassanra qui n'est pas gratuit). – JohnC

Répondre

3

Ce n'est pas vraiment un problème de l'interrogation d'un type défini par l'utilisateur: imaginez que address serait une seule colonne text et que addresses contiendrait une seule adresse, (c.-à-addresses TEXT.) le problème serait le même.

Votre table d'utilisateur n'est pas destinée à être interrogée par autre chose que la clé primaire, qui dans ce cas est la clé de partition, qui est un UUID ce qui la rend quasi inutile.

Si vous souhaitez interroger les utilisateurs par leur nom, je dénormaliser (qui implique une certaine duplication) et faire une table users_by_name:

CREATE TABLE users_by_name(
    name TEXT, 
    id UUID, 
    addresses whatever, 
    PRIMARY KEY((name), id) 
) 

où les utilisateurs sont stockés par name (ils doivent être uniques) et la les résultats seront récupérés triés par id (id est la partie clé de la clé primaire).

va de même pour la requête par des adresses:

CREATE TABLE users_by_name(
    city TEXT, 
    street TEXT, 
    name TEXT, 
    id UUID, 
    PRIMARY KEY((city), street) 
) 

Vous pourriez penser que cela ne résout pas vraiment le problème, mais il semble que vous avez conçu votre modèle de données à partir d'un point de vue DB (SQL) relationnelle, ce n'est pas le but avec Cassandra.

+1

merci c'était utile – reihaneh