2011-11-26 208 views
6

我需要为我的案例提供最干净,最有效的解决方案。我试图将学生的Marks存储在MySQL数据库中。学生可能是“不可能”或“复制案例”,我想将这些信息存储在数据库中。在MySQL数据库中存储枚举

我想为上例指定代码,例如对于ABSENT为-1,对于COPY CASE为-2等。此代码将仅存储在Marks列中。

更多的,当用选择查询阅读它们时,我应该得到它们的显示值,即ABSENT,COPY CASE等。

所有这些只能在DB端实现吗?

还是我需要在应用程序级别实现这些东西?

是否有任何API可用于Java的这种功能?

回答

4

如何对存储其name()(字符串版本),以DB和创建它的背部,同时使用valueOf()

1

如果枚举字符串表示相当串重从数据库读取和数据库规模较大(对这些枚举支票频繁),我可能将每个枚举映射到一个整数常量(不,不是ordinal(),但您自己的自定义整数值),并在枚举上有方法从这些值中获取并创建一个枚举。这样,你就可以非常有效地存储枚举。

public enum Status { 

    ABSENT(1), COPY_PASTE(2); 

    int value; 

    private Status(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return this.value; 
    } 

    public static Status ofStatusCode(int value) { 
     // retrieve status from status code 
    } 

} 
+0

只是注意的是,虽然我与桑杰·同意在使用[数字类型(http://dev.mysql.com/doc/ refman/5.0/en/integer-types.html)枚举的表示通常比使用[字符串类型]更高效(http://dev.mysql.com/doc/refman/5.0/en/char.html)(性能和空间明智),枚举类型是一个例外,它将使用一个16位无符号(短)内部有效地存储值,我从来没有性能问题。 –

0

MySQL拥有自己的ENUM type。正如@Jigar指出的那样,您可以使用Enum.getName来获取Java的一个表示持久性的枚举的字符串,从字符串中检索字段并使用Enum.valueOf加载枚举常量。

您还可以使用Enum.ordinal() + 1得到一个整数的持久性(MySQL还支持使用整数指标直接与ENUM类型),并发出一个查询,如:

SELECT enum_col-1 FROM tbl_name; 

检索顺序背(它将检索 - 1用于具有无效枚举值的行)。

Plus MyEnumType value = MyEnumType.values()[ordinal]将其转换回Java枚举类型。

无论如何,我认为基于字符串的解决方案更清洁,更优雅,并且长期运行更安全(如果您需要更改Java Enum的顺序,或者在现有的中间添加新的枚举值一些,你会感谢你自己以String为基础的策略开始)。

6

MySQL支持枚举:

CREATE TABLE students (name varchar(64), mark ENUM('ABSENT','COPY CASE')); 
INSERT INTO students VALUES ('john', 'COPY CASE'); 

在java中,你可以把这个列作为一个字符串类型列,但在数据库中,值高效地存储,并试图存储不包含在枚举值将导致错误。

+1

第二个要求可以通过参照完整性来满足。 –

1

我想存储上述情况下的代码,例如对于ABSENT为-1,对于COPY CASE为-2等。此代码将仅存储在Marks列中。

我宁愿喜欢有一个单独的列,说status持有的值,如 ABSENTCOPY CASEAPPEARED

,标志着列的默认值,将保持独立。

在视图层,你可以不喜欢

 
if(status is 'APPEARED') 
show marks field 
else 
show status field 
+1

在同一列中存储标记和考试状态绝对会更好。而且,您不会在查找中找到任何错误的结果(即使偶然),例如“AVG(mark)” –