【问题标题】:Enum data type in CassandraCassandra 中的枚举数据类型
【发布时间】:2014-06-25 10:56:56
【问题描述】:

我正在尝试将我的数据库从 MySQL 迁移到 Cassasndra。我面临的问题是定义为枚举的列类型之一(枚举('GP','NGP','PGP','PAGP'))。 Cassandra 不支持 Enum 数据类型(尽管它支持集合)。有没有办法在 Cassandra 中实现 Enum 数据类型,以便列的值应该限制在一组值中?我使用的是 Apache Cassandra 2.0.7 版。

【问题讨论】:

标签: enums cassandra cassandra-2.0


【解决方案1】:

据我所知,在阅读有关 cql 类型的文档后,您不能在 cql 语句中直接使用枚举(我为 java 客户端检查了这一点)。

因此,您可以选择将 Enum 转换为 String 以在 cql 语句中包含该字段。通过这种方式,您的所有应用程序都使用枚举,但在后端层使用枚举的字符串表示。

【讨论】:

  • 是的,在文档中没有像 Enum 这样的数据类型。我想我需要复制这种行为。但是,如果我打算将我当前的数据库从 MySQL 迁移到 Cassandra,那该怎么做呢?
  • 选项?什么意思?
  • 我的意思是目前我正在使用支持 Enum 的 MySQL。但基于我的某些业务因素,我可能会迁移到 Cassandra。在那种情况下,我如何支持 Cassandra 中的 Enum 类型列。可能是我没有通过客户端与 Cassandra 交互,可能直接使用 CQLSH 进行交互。在那种情况下如何使用那个 Enum 类型的列?
  • 不能使用 Enum 与 Cassandra 交互,必须在执行 cql 之前将 Enum 转换为 String。
【解决方案2】:

我在整数枚举方面遇到了同样的问题......这就是我所做的:

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>()),
    });

使用 C# 驱动程序 2.5 和 DSE 4.7。

【讨论】:

    【解决方案3】:

    cassandra 中或多或少地原生支持枚举

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

    据我所知,您可以为 cassandra 编写自己的自定义序列化程序等,它将能够理解您的特定枚举。但那些罐子应该放在 cassandra 文件夹中。

    您也可以将其存储为 String 或序数 int 值

    【讨论】:

      【解决方案4】:

      请参阅 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/

      【讨论】:

        猜你喜欢
        • 2014-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多