2014-05-08 11 views
11

Ich versuche, meine Datenbank von MySQL zu Cassasndra zu migrieren. Das Problem, mit dem ich konfrontiert bin, ist mit einem der Spaltentypen definiert als Enum (enum ('GP', 'NGP', 'PGP', 'PAGP')). Cassandra unterstützt keine Enum-Datentypen (es unterstützt jedoch Sammlungen). Gibt es eine Möglichkeit, Enum-Datentyp in Cassandra zu implementieren, so dass der Wert einer Spalte aus einer Gruppe von Werten eingeschränkt werden sollte? Ich benutze Apache Cassandra Version 2.0.7.Enum-Datentyp in Cassandra

+0

Siehe auch [Datastax Java Treiber 3.0.0 Aufzählung Annotation nicht gefunden] (http://StackOverflow.com/A/35135223) –

Antwort

4

Soweit ich weiß und nach dem Lesen der Dokumentation über CQL-Typen, können Sie nicht direkt enum in CQL-Anweisungen verwenden (ich überprüfe dies für die Java-Clients).

Also die Option, die Sie haben, ist die Enum in String konvertieren, um das Feld in eine CQL-Anweisung aufzunehmen. Auf diese Weise verwenden alle Ihre Anwendung die Enum, aber in der Backend-Ebene verwenden Sie die String-Repräsentation für die Enumeration.

+0

Ja in der Dokumentation gibt es keinen Datentyp wie Enum. Ich denke, ich muss das Verhalten replizieren. Aber was ist die Option, wenn ich meine aktuelle DB von MySQL nach Cassandra verschieben will? – Nayan

+0

Optionen? Was meinen Sie? – ftrujillo

+0

Ich meinte derzeit verwende ich MySQL, die Enum unterstützt. Aber basierend auf meinen bestimmten geschäftlichen Faktoren könnte ich nach Cassandra ziehen. In diesem Fall kann ich diese Enum-Typ-Spalte in der Cassandra unterstützen. Es kann der Fall sein, dass ich nicht über einen Client mit Cassandra interagiere, sondern direkt mit CQLSH interagieren kann. In diesem Fall, wie diese Enum type Spalte zu verwenden? – Nayan

3

ich das gleiche Problem mit einer ganzen Zahl Enum konfrontiert wurde ... hier ist das, was ich getan habe:

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

Verwendung von C# 2.5-Treiber und DSE 4.7.

9

DataStax cassandra Object-Mapping-API Siehe

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/