从数据库中的预定义值列表中存储值的最佳方法是什么?

Yat*_*oel 5 java database enums

假设我有一个预定义的值列表(RW,FW,4W),表示车辆的驱动类型:

RW - 后轮

前锋 - 前轮

4W - 四轮

现在,我想从上面的3个值中取一个值作为我用户的输入,然后将其存储在数据库中.

据我所知,我可以借助以下任何一种方法执行此操作:

- 在UI上对值进行硬编码,以便UI显示仅具有上述3个值的下拉列表.然后将该值存储String vehicleTypeVehicle vehicle对象的字段中,然后将其存储在DB中String.

  • 缺点:

    一世).没有验证对象级别的值

    ⅱ).没有验证数据库级别的值.

    III).虽然很少需要为列表添加新值,但用户仍然无法在运行时添加新值

    - 优点:

    一世).无需join在DB处检索vehicle对象

要么

  • VEHICLE_TYPE在DB中创建一个具有所有3个值的单独表,并将其与VEHICLE表通过表链接.外键.然后从VEHICLE_TYPE表中填充UI的下拉列表.将值存储在vehicle对象中String

    - 缺点:

    一世).在对象级别没有验证

    ⅱ).需要join在DB处检索vehicle对象

    - 优点:

    一世).验证DB级别的值(通过外键)

    ⅱ).用户可以在运行时向列表中添加新值

要么

  • VEHICLE_TYPE在DB中创建一个具有所有3个值的单独表,但不要将其与VEHICLE表通过.外键.然后从VEHICLE_TYPE表中填充UI的下拉列表.将值存储在vehicle对象和DB中String

    - 缺点:

    一世).在对象级别没有验证

    ⅱ).没有DB级别的验证

    - 优点:

    一世).没有join需要在数据库级别

    ⅱ).用户可以向列表中添加新值

要么

  • VEHICLE_TYPE在DB中创建一个具有所有3个值的单独表,并将其与VEHICLE表通过表链接.外键.然后从VEHICLE_TYPE表中填充UI的下拉列表.做一个enum VehicleType在Java中,然后添加一个字段VehicleType vehicleTypeVehicle类.根据用户的输入,在字段中存储VehicleType枚举值vehicleType.

    -Cons:

    一世).必须在两个地方更新列表:VehicleType枚举和VEHICLE_TYPE表.可能会导致不一致.

    ⅱ).用户无法在列表中添加新值(他可以在表中添加值但不能更改枚举)

    - 优点:

    一世).在UI级别进行验证

    ⅱ).对象级别的验证

    III).数据库级别的验证

问题:我们 是否有其他方式可以执行上述任务,但没有任何上述缺点?

Dav*_*ave 2

当然。第二个经过修改的:

VEHICLE_TYPE在数据库中创建一个包含所有 3 个值的单独表,并将其与该VEHICLE表通过链接。外键。然后从表中填充 UI 的下拉列表VEHICLE_TYPE。将车辆对象中的值存储为String。调用时vehicle.setVehicleType(),通过检查 DB 中的可能值来验证分配的值是否有效。如果无效,则抛出一个InvalidArgumentException或一个子类。

现在您已经在对象中进行了验证。而且,我不认为必须参加一个骗局。如果不连接表,您将无法做很多事情。这就是为什么你有很多桌子。