【问题标题】:Reference Table OR Java Enum which is better参考表或 Java 枚举哪个更好
【发布时间】:2021-12-03 02:18:48
【问题描述】:

我有一个数据库实体:worker,而且本质上有两种类型的worker,

  1. 全职
  2. 兼职

我确信这个类型列表不会经常增长。

id name worker_type_id
1 Adam 1
2 Milne 2
public class Worker{
 private int id;
 private int name;
 private WorkerType type;
}

对于 Worker_Type,我有两个选择:

  1. 创建一个 WorkerType 的 Java ENUM

    public enum WorkerType{
    
     WorkerType(int id, String name){
      this.id = id;
      this.name = name;
     }
    
     int id;
     String name;
    }
    
  2. 创建一个存储 WorkerType 的引用表。

worker_type_id worker_type_label
1 Full Time
2 Part Time

我倾向于使用“1”,但我看到很多人赞成“2”。除了明显的比较之外,我将如何在代码中查询工作表中的所有全职工作人员?

select * from worker join worker_type 在 worker.worker_type_id = worker_type.id 其中worker_type = '全职';

我对上述查询的问题是我的代码如何知道字符串“全职”?如果有人错误地更改了标签,它将完全破坏代码。我该如何处理?

【问题讨论】:

标签: java mysql sql enums reference


【解决方案1】:

您的示例代码:

public enum WorkerType{

 WorkerType(int id, String name){
  this.id = id;
  this.name = name;
 }

 int id;
 String name;
}

... 混淆了您的问题。您将您的工人类型与您的实际工人混合在一起。

可能适合您情况的代码是代表每个工人的类。

public record Worker( int id , String name , Classifation classifation ) {}

worker的类型是一个单独的枚举,只有两个命名对象(一个是全职的,一个是兼职的),不需要自定义构造函数。

public enum Classifation { FULL_TIME, PART_TIME }

我会将 type-of-worker 枚举嵌套在 worker 类中。这种嵌套清楚地表明 type-of-worker 枚举对象主要仅在该类中使用。

public record Worker( int id , String name , Classifation classifation )
{
    public enum Classifation { FULL_TIME, PART_TIME }
}

用法:

Worker adam = new Worker( 1 , "Adam" , Worker.Classifation.FULL_TIME );
Worker milne = new Worker( 2 , "Milne" , Worker.Classifation.PART_TIME );

System.out.println( List.of( adam , milne ) );

运行时。

[Worker[id=1, name=Adam, classifation=FULL_TIME], Worker[id=2, name=Milne, classifation=PART_TIME]]


你的标题要求:

参考表或 Java 枚举哪个更好

至少有两个因素需要考虑:

  • 是否只会在您编写 Java 应用程序时才发生不常见的更改?
  • 其他应用或 DBA 是否需要查找这些数据?

Java 中的枚举用于自动实例化一组在编译时已知的有限命名对象。您不能在运行时更改枚举。

如果在部署您的应用时此信息可能发生变化,则枚举不合适。相反,您需要在运行时动态创建对象集合。

如果其他应用程序或DBA 可能需要查找此信息,那么您应该将该信息记录在数据库中,而不是在您的 Java 应用程序中。

鉴于您的示例场景,我怀疑您可能想要 both Java 中的枚举在数据库中查找引用表。


另一种方法是使用人类可读的文本而不是纯整数作为WORKER_TYPE 列。在您的情况下,存储文本值,例如 Full-timePart-time,或 FullPart。在这种情况下,不需要循环参考表。这种方法假设 (A) 没有业务需要类型代码(12),并且 (B) 在描述工人类型时没有其他列可跟踪。

此外,在更复杂的数据库中,您可以让数据库强制存储在该列中的一组有限的可能值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2018-03-23
    • 2014-09-10
    • 2012-01-21
    • 2013-07-07
    相关资源
    最近更新 更多