2015-11-30 2 views
-1

Я новичок в Cassandra db и пытаюсь запросить подзаголовок First Name из приведенной ниже таблицы, но неудачно. Я могу запросить имя прямого столбца, но не под него.Cassandra DB - запрос подзаголовка

CALLER INFO Структура таблицы ниже:

1. Unique ID 
2. CustomerInfo 
     {First Name, 
     Middle Name, 
     Last Name, 
     Date of Birth, 
     Sex} 

Пожалуйста, дайте мне знать запрос для получения сведений о First Name, DOB и т.д.

ответ

1

Чтобы ответить на ваш вопрос сразу, 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) 

Это может (или не может) работать для вашего прецедента. Честно говоря, я бы не использовал этот подход по двум причинам.

  1. Вторичные индексы, как известно, не работают хорошо по шкале ... и это для столбца без коллекции/UDT. Я могу только представить, что вторичный индекс в UDT будет хуже.
  2. Вы можете очень легко смоделируйте это в Кассандре без, используя 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) я бы создал новую аналогичную таблицу запросов и дублировал ваши данные там.

Смежные вопросы