Чтобы ответить на ваш вопрос сразу, Cassandra 2.1 docs have an example для это. На основании информации, предоставленной вами, я создам пользователя определенный тип (UDT):
[email protected]:stackoverflow> CREATE TYPE info (
... firstName TEXT,
... middleName TEXT,
... lastName TEXT,
... dob TEXT,
... sex TEXT);
Тогда я создать таблицу с именем callerInfo
:
[email protected]:stackoverflow> CREATE TABLE callerInfo (
... customerID UUID,
... customerInfo frozen<info>,
... PRIMARY KEY customerID);
Далее я создам вторичный индекс customerInfo
:
[email protected]:stackoverflow> CREATE INDEX cinfo_idx ON callerInfo (customerInfo);
Теперь я попытаюсь запросить только на lastName
:
[email protected]:stackoverflow> SELECT * FROM callerInfo WHERE customerInfo={lastName:'Scott'};
(0 rows)
Почему это не работает? Потому что при текущей реализации вторичных индексов на UDT я должен указать условия для всех компонентов.
[email protected]:stackoverflow> SELECT * FROM callerInfo WHERE
customerInfo={firstName:'Michael', middlename:'Gary', lastname:'Scott', dob:'1964/03/15', sex:'M'};
customerid | customerinfo
--------------------------------------+--------------------------------------------------------------------------------------------
f1dea08f-5870-402d-82e1-ee9e215e0294 | {firstname: 'Michael', middlename: 'Gary', lastname: 'Scott', dob: '1964/03/15', sex: 'M'}
(1 rows)
Это может (или не может) работать для вашего прецедента. Честно говоря, я бы не использовал этот подход по двум причинам.
- Вторичные индексы, как известно, не работают хорошо по шкале ... и это для столбца без коллекции/UDT. Я могу только представить, что вторичный индекс в UDT будет хуже.
- Вы можете очень легко смоделируйте это в Кассандре без, используя UDT или вторичный индекс.
Так как вы определили, что вам нужно запросить своих клиентов по фамилиям, я бы спроектировать таблицу, специально служить этот запрос:
CREATE TABLE callerInfoByLastName (
lastName TEXT,
firstName TEXT,
middleName TEXT,
customerID UUID,
dob TEXT,
sex TEXT,
PRIMARY KEY ((lastName),firstName,middleName,customerID));
Теперь вы можете запросить по lastName
, и заказали Ваши данные по firstName
и middleName
(в пределах каждого lastName
). customerID
добавлен в PK для обеспечения уникальности (в случае, если у вас есть разные люди с тем же именем). Для даты рождения (dob) я бы создал новую аналогичную таблицу запросов и дублировал ваши данные там.