我正在制作一个将数据发布到数据库的程序,并且遇到了我确定熟悉的模式:一个最有可能(很可能)固定值的简短表,它用作枚举。因此,假设下表名为Status
:
状态 编号说明 -------------- 0未处理 1个待处理 2已处理 3错误
在我的程序中,我需要确定另一个表的状态ID,或者可能用新的状态ID更新记录。
我可以在一个枚举中对状态ID进行硬编码,并希望没人能更改数据库。或者,我可以预取基于上述说明的值(从而硬编码即代替)。
保持这两个枚举和表同步的正确方法是什么?
我正在制作一个将数据发布到数据库的程序,并且遇到了我确定熟悉的模式:一个最有可能(很可能)固定值的简短表,它用作枚举。因此,假设下表名为Status
:
状态 编号说明 -------------- 0未处理 1个待处理 2已处理 3错误
在我的程序中,我需要确定另一个表的状态ID,或者可能用新的状态ID更新记录。
我可以在一个枚举中对状态ID进行硬编码,并希望没人能更改数据库。或者,我可以预取基于上述说明的值(从而硬编码即代替)。
保持这两个枚举和表同步的正确方法是什么?
Answers:
我会在您的程序中对枚举进行硬编码,因为我怀疑这些不同的状态会影响您的程序逻辑。如果您具有新状态,那么您的程序应该如何应对这种新状态?
因为数据库是应用程序的一部分,所以我认为在不咨询其他方面的情况下影响一个数据库是没有意义的。
pending
。当然,有一张Status
表可以为您提供参照完整性,但这超出了我要提出的观点。
Status
表不应在应用程序运行时视为动态表,因此我不认为您应该这样阅读它。
我通常会在应用程序启动时将此数据加载到静态缓存中(通常在HashMap或类似的东西中)。它避免了仅由于枚举已被某种方式修改而不得不重新编译的方法。
我们的项目中有类似的问题(旧版代码,万岁!),主要问题是“枚举表永远都不会改变”,直到它们改变并且代码中断为止。我有两种缓解策略,以缓解自己一直在朝着缓慢方向迁移的趋势。
首先也是最好的办法是,尽可能消除对这些值的直接引用。总是问:“为什么我需要直接使用枚举值?” 在许多情况下,这表明该代码具有太多硬编码的假设或正在尝试对数据进行过多的处理。看看您是否无法在数据库中建立更好的关系,或者无法获得更灵活的代码来处理所操纵的内容。
当那行不通时,我去计划B:代码生成。由于表很少更改,并且我们会定期发布新版本,因此代码生成器可以读取枚举表并编写枚举代码。然后在项目中使用此动态生成的库。如果数据库发生更改,下一个构建将无法编译,这比获取神秘的运行时错误要好得多。