Поддерживает тип коллекции карт в 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 Приветствия, Карло

Другие вопросы по тегам