поддерживает ли тип коллекции карт в cassandra 2.0

#php #cassandra #phpcassa

#php #cassandra #phpcassa

Вопрос:

когда я создаю таблицу в cassandra 2.0 с помощью phpcassa, я получил следующую ошибку

  Fatal error: Uncaught exception 'cassandraInvalidRequestException' with message 'line 2:25 mismatched input 'map' expecting set null' in /var/www/assignment1/lib/thrift/Thrift.php:574
  

мой код выглядит следующим образом

  $raw->client->execute_cql_query("CREATE TABLE 
mc_user(mc_user_id uuid primary key ,mc_user_email varchar,mc_user_pwd varchar,mc_status varchar,mc_user_type map<varchar,varchar>)", Compression::NONE);
  

если он не поддерживает, может ли кто-нибудь дать мне альтернативное решение для отношения «один ко многим»?

Ответ №1:

Коллекции определенно поддерживаются в Cassandra начиная с версии 1.2 — Я не знаю PHP Cassa, однако ваше утверждение выглядит правильным, поэтому я бы поискал решение на стороне клиента.

Альтернативой может быть использование составного ключа, в котором вторая часть ключа является ключом, который вы хотели использовать на карте

 CREATE TABLE mc_user(
    mc_user_id uuid,
    themapkey varchar,
    mc_user_email varchar static,
    mc_user_pwd varchar static,
    mc_status varchar static,
    themapvalue varchar,
    PRIMARY KEY (mc_user_id, themapkey) 
);
  

Теперь вместо одной записи для каждого пользователя с картой у вас есть много записей для каждого пользователя.
Я сделал адрес электронной почты, пароль и статус статическими, поскольку они должны быть одинаковыми для каждого mc_user_id (на мой взгляд, два основных преимущества: они не реплицируются в каждой строке, поэтому они не будут тратить место на диске, и вы можете легко обновить их всего с помощью 1 инструкции update, поскольку статические столбцы доступны только по ключу раздела).

Вы по-прежнему можете извлекать информацию о пользователе (теперь статическую) только с помощью mc_user_id

 select mc_user_email, mc_status from mc_user where mc_user_id=some_id
  

Вы можете получить запись «map» с помощью mc_user_id, themapkey

 select themapvalue from mc_user where mc_user_id=some_id and themapkey=some_key
  

Вы также можете легко перестроить всю карту с помощью select *

 select * from mc_user where mc_user_id=some_id
  

HTH
Приветствия,
Carlo

Ответ №2:

Можете попробовать использовать эту библиотеку. Он не требует Trift и работает с использованием двоичного протокола.