#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 и работает с использованием двоичного протокола.