Поддерживает тип коллекции карт в Cassandra 2.0
Когда я создаю таблицу в Cassandra 2.0 с помощью phpcassa, я получил ошибку следующим образом
Fatal error: Uncaught exception 'cassandra\InvalidRequestException' 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);
если он не поддерживает, кто-нибудь может дать мне альтернативное решение для отношения один ко многим?
2 ответа
Можете попробовать использовать эту библиотеку. Он не требует Trift и работает с использованием двоичного протокола.
Коллекции определенно поддерживаются в 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 (у меня на уме два главных преимущества: они не реплицируются в каждой строке, поэтому они не будут тратить место на диске, и вы можете легко их обновить только с одним оператором обновления, поскольку статические столбцы доступны только по ключу раздела).
Вы все еще можете получить информацию о пользователе (теперь статичную) только с помощью 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 * from mc_user where mc_user_id=some_id
HTH Приветствия, Карло