如何最好地表示数据库中的常量(枚举)(INT与VARCHAR)?

什么是性能方面的最佳解决方案和“可读性/良好的编码风格”来表示DB层上的(Java)枚举(固定的常量集)关于整数(或一般的任何数字数据类型)与字符串的关系表示.

警告:有些数据库系统直接支持“枚举”,但这需要保持数据库枚举定义与业务层实现同步.此外,这种数据类型可能并非在所有数据库系统上都可用,并且语法=>也可能不同.我正在寻找一个易于管理的简单解决方案,并且可在所有数据库系统上使用. (所以我的问题只是解决了Number vs String表示.)

在我看来,常量的Number表示非常有效(例如,仅消耗两个字节作为整数),并且在索引方面很可能非常快,但难以阅读(“0”与“1”等). .

字符串表示更具可读性(与“0”和“1”相比,存储“已启用”和“已禁用”),但消耗的存储空间很多,并且在索引方面很可能也较慢.

我的问题是,我是否错过了一些重要方面?您建议在数据库层上使用枚举表示法.

非常感谢你!

最佳答案
在大多数情况下,我更喜欢使用短的字母数字代码,然后使用扩展文本的查找表.必要时,我从数据库表中动态地在程序中构建枚举表.

例如,假设我们有一个应该包含事务类型的字段,可能的值是Sale,Return,Service和Layaway.我将创建一个包含代码和描述的事务类型表,使代码可以是“SA”,“RE”,“SV”和“LY”,并使用代码字段作为主键.然后在每个交易记录中我发布该代码.这比记录本身和索引中的整数键占用的空间更少.究竟如何处理它取决于数据库引擎,但它的效率不应低于整数键.而且因为它的助记符很容易使用.您可以转储记录并轻松查看值是什么,并且可能记住哪个是哪个.您可以在用户输出显示没有翻译的代码,用户可以理解它们.实际上,这可以使您获得超过整数键的性能提升:在许多情况下,缩写对用户有利 – 他们经常需要缩写来保持显示紧凑并避免滚动 – 因此您不需要加入事务表得到一个翻译.

我绝对不会在每条记录中存储长文本值.就像在这个例子中,我不想放弃交易表并存储“Layaway”.这不仅效率低下,而且很可能有一天用户会说他们希望将其改为“Layaway sale”,甚至是“Lay-away”之类的微妙差异.然后,您不仅需要更新数据库中的每条记录,而且还必须在程序中搜索此文本发生的每个位置并进行更改.此外,文本越长,程序员错误拼写并创建模糊错误的可能性越大.

此外,具有事务类型表提供了存储有关事务类型的附加信息的便利位置.永远不要写代码说“if whatevercode =’A’或whatevercode =’C’或whatevercode =’X’然后……”无论是什么使得这三个代码与所有其他代码有所不同,请为它在事务表中并测试该字段.如果你说“嗯,这些都是与税收相关的代码”或其他什么,那么很好,创建一个名为“tax_related”的字段,并根据需要为每个代码值设置为true或false.否则当有人创建新的事务类型时,他们必须查看所有这些if /或列表,并找出应该添加哪种类型以及不应添加哪种类型.我已经阅读了很多令人困惑的程序,我必须弄清楚为什么某些逻辑应用于这三个代码值而不是其他代码值,当你认为第四个值应该包含在列表中时,很难判断它是否是失踪,因为它在某种程度上是真的不同,或者如果程序员犯了错误.

我没有创建转换表的唯一类型是当列表非常短时,没有其他数据需要保留,并且从宇宙的性质可以清楚地看出,它不可能永远改变,因此值可以安全硬编码.像真/假或正/负/零或男/女. (嘿,即使是最后一个,看起来很明显,有人坚持我们现在包括“变性”之类的东西.)

有些人教条地坚持每个表都有一个自动生成的顺序整数键.在许多情况下,这样的键是一个很好的选择,但对于代码列表,我更喜欢短阿尔法键,原因如上所述.

相关文章

Java中的String是不可变对象 在面向对象及函数编程语言中,不...
String, StringBuffer 和 StringBuilder 可变性 String不可变...
序列化:把对象转换为字节序列的过程称为对象的序列化. 反序...
先说结论,是对象!可以继续往下看 数组是不是对象 什么是对...
为什么浮点数 float 或 double 运算的时候会有精度丢失的风险...
面试题引入 这里引申出一个经典问题,看下面代码 Integer a ...