Тип данных Enum в Кассандре

Я пытаюсь перенести мою базу данных из MySQL в Cassasndra. Проблема, с которой я столкнулся, - это один из типов столбцов, определенных как Enum (перечисление ( "GP", "NGP", "PGP", "PAGP" )). Cassandra не поддерживает типы данных Enum (хотя он поддерживает коллекции). Есть ли способ реализовать тип данных Enum в Cassandra, так что значение столбца должно быть ограничено набором значений? Я использую Apache Cassandra версии 2.0.7.

Ответ 1

См. datastax cassandra API сопоставления объектов,

http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html

enum Gender { FEMALE, MALE };

// FEMALE will be persisted as 'FEMALE'
@Enumerated(EnumType.STRING)
private Gender gender;

// FEMALE will be persisted as 0, MALE as 1
@Enumerated(EnumType.ORDINAL)
private Gender gender

для cassandra 3.0

enum State {INIT, RUNNING, STOPPING, STOPPED}

cluster.getConfiguration().getCodecRegistry()
        .register(new EnumNameCodec<State>(State.class));

// schema: create table name_example(id int PRIMARY KEY, state text)
session.execute("insert into name_example (id, state) values (1, ?)", State.INIT);
// state is saved as 'INIT'

http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/extras/

Ответ 2

Насколько я знаю и прочитав документацию о типах cql, вы не можете использовать непосредственно enum в операторах cql (я проверяю это для java-клиентов).

Таким образом, у вас есть вариант преобразования Enum to String для включения поля в оператор cql. Таким образом, все ваше приложение использует Enum, но в backend-слое используется строковое представление для перечисления.

Ответ 3

Я столкнулся с той же проблемой с целым перечислением... вот что я сделал:

MappingConfiguration.Global.Define(
    new[] { 
       new Map<Login>()
            .TableName("logins")
            .PartitionKey(el => el.UserId)
            .Column(el => el.UserId, cm => cm.WithName("user_id")),
            .Column(el => el.Gender, cm => cm.WithName("gender_id").WithDbType<int>()),
    });

Использование С# драйвера 2.5 и DSE 4.7.

Ответ 4

существует более или менее нативная поддержка перечислений в cassandra

http://docs.datastax.com/en/developer/java-driver/2.1/java-driver/reference/crudOperations.html

Насколько я знаю, вы можете написать свои собственные сериализаторы и т.д. для cassandra, и он сможет понять ваше конкретное перечисление. Но эти банки должны быть в папке cassandra.

Вы также можете сохранить его как String или порядковое значение int