在DB和UI中表示字符串值集的最佳方法

时间:2015-07-22 17:40:01

标签: java database-design relational-database

我正在寻找意见所以我想这是一个更好的'题。我有一个使用Javascript / jQuery的webapp构建和使用Hibernate访问关系数据库(MySQL)中的数据的struts。当一个对象/数据库字段的值有一组有限的字符串时,最好是在对象/数据库中使用完整的字符串,还是使用'代码'对于那个字符串,就像一个CHAR而不是整个字符串?

class User {
    int    id;
    String userName;
    String type;        // Values of 'Administrator', 'Regular'
OR
    char   type         // Values of 'A', 'R'
OR 
    char   type         // Values of 'A', 'R'
    String typeString;  // Can be returned on the fly based on 'type' or by DB in SQL CASE statement
}

如果数据库具有完整的文本字符串,那么它的编码很容易,但它会浪费空间(在数据库中,数据传输)只有少量值的东西。

如果数据库只有一个'代码'然后,当向用户呈现此字段时(如在现有用户的网格中,或在创建新用户时显示下拉列表选择列表),char值必须转换为完整字符串。那么问题是转换应该在哪里完成?它可以在数据库级别,Hibernate可以从CASE语句填充完整的字符串值。这样可以节省数据库空间,但不会节省数据传输或内存。它可以在对象级别,在“getter / setter”中为“'类型”进行处理。领域。或者它可以一直在GUI中Javascript转换' char'到适当的字符串供用户查看。

另外......如果任何一种方法都可以使用,可能会影响你做出的选择?不同值的数量?字符串的最大长度?表中预计有多少行?

我确信每个数据库/程序员都会多次遇到这种情况,并且可能有偏好。

3 个答案:

答案 0 :(得分:0)

我认为最好从类型转换到类型(反之亦然)尽可能接近数据库交互 - 在这种情况下是Hibernate。这是因为如果使用显式类型,您的应用程序逻辑将变得更具可读性和直观性。

在我看来 - if(BMW.equals(carTypeCode)) {}if("X".equals(carTypeCode)) {}更具可读性。

我对Hibernate并不是很熟悉,但是如果你可以利用Hibernate将String映射到DB表示,反之亦然(可能正如你所提到的那样使用CASE)。就个人而言,我可能会将这些字符串建模为枚举,并使用SweetBlue之类的东西。此外,您应该考虑通过使这些类型代码至少有少量字符来使这些类型代码有点可读,因为当您通过查看数据库转储调试某些问题时这些代码可能会派上用场,而您不必查询类型代码输入转换图表。

我不认为表现明智不会对普通情况产生太大影响。

答案 1 :(得分:0)

如果您只拥有一组固定的用户类型,例如AdminRegular,我认为在您的代码中使用静态hashmap会更容易,只需存储A和{{ 1}}在您的代码中。类似的东西:

R

当您从DB获得结果时,您可以static HashMap<Character,String> userRoles = new HashMap<>(); static{ userRoles.put("A","Admin"); userRoles.put("R", "Regular"); } 检查实际类型。这节省了空间,也是可读的。

答案 2 :(得分:0)

我会将全名放在数据库中,并在某种查找表中附加相关的短代码或ID。使用短代码/ ID作为查找表的主键,以及作为其他表的外键。如果有人需要调查数据库层,或者有人需要使用数据库进行报告,数据仓库或分析,这将大大简化事情。

通常将名称变量,数据库表,数据库列,函数等命名为不明确的名称或缩写并不是每个人都能理解的错误做法 - 这样的短代码应该以相同的方式看待。