2016-01-03 1 views
1

В этом примере:Поиск в определенном пользователе типа с 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> 
) 

Как я могу запросить пользователь city = newyork или найти пользователь с определенным номером телефона.

+0

Я согласен с принятым ответом на то, что вы должны пересмотреть свою модель данных в оптимальном для Кассандры пути. В более широком смысле интеграция Cassandra с Apache Solr позволяет запрашивать непервичные ключевые поля, включая пользовательские типы: http://docs.datastax.com/en/latest-dse/datastax_enterprise/srch/srchUDT.html (ссылка руководство по конфигурированию UDT в Solr для пакета DataStax Enterprise Cassanra, который не является бесплатным). – JohnC

ответ

3

Это на самом деле не проблема запрашивая определяемого пользователем типа: представьте себе, что address бы один столбец text и addresses будет содержать один адрес; (т.е. addresses TEXT.) проблема будет такой же.

Ваша пользовательская таблица не предназначена для обработки запросов ничем иным, кроме первичного ключа, который в данном случае является ключом раздела, который является UUID, что делает его бесполезным.

Если вы хотите запросить пользователей по имени, я бы Денормализовать (что подразумевает некоторое дублирование) и сделать users_by_name таблицу:

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

где пользователи хранятся name (они должны быть уникальными) и результаты будут отсортированы по id (id - ключевая часть кластеризации первичного ключа).

То же самое для запроса по адресам:

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

Вы можете подумать, что это не решает проблему, но это выглядит, как Вы проектировали модель данных из реляционной БД (SQL) точки зрения, это не цель с Кассандрой.

+1

спасибо, что это было полезно – reihaneh