代码之家  ›  专栏  ›  技术社区  ›  Amit

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

  •  5
  • Amit  · 技术社区  · 15 年前

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

    雷沃

    前进

    4瓦 -四轮

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

    据我所知,我可以通过以下任何方法执行此操作:

    -硬编码UI上的值,以便UI显示只有上述3个值的下拉列表。然后将该值存储在 String vehicleType Vehicle vehicle 对象,然后将其作为 String

    • 欺骗:

      i) 是的。在对象级别不验证值

      二)。数据库级别的值没有验证。

      三)。虽然很少需要向列表中添加新值,但用户仍然无法在运行时添加新值

      -优点:

      i) 是的。不需要 join 在数据库中检索 vehicle

    或者

    • 做一张单独的桌子 VEHICLE_TYPE 在所有3个值的数据库中,并将其与 VEHICLE 桌子通过。外键。然后从 车辆类型 车辆 对象为

      -缺点:

      i) 是的。在对象级别没有验证

      参加 车辆 对象

      -优点:

      i) 是的。在数据库级别验证值(通过外键)

    • 做一张单独的桌子 车辆类型 在数据库中有3个值,但是 把它和 桌子通过。外键。然后从 车辆类型 车辆 对象和数据库中的 字符串

      -缺点:

      i) 是的。在对象级别没有验证

      二)。在数据库级别没有验证

      -优点:

      参加 DB级要求

    • 做一张单独的桌子 在所有3个值的数据库中,并将其与 车辆类型 桌子。做一个 enum VehicleType VehicleType vehicleType Vehicle VehicleType vehicleType 基于用户输入的字段。

      i) 是的。必须在两个位置更新列表: 枚举和

      二)。用户无法向列表中添加新值(他可以在表中添加值,但无法更改枚举)

      -优点:

      二)。对象级验证

      三)。数据库级验证

    有没有其他方法可以让我们完成上述任务,而不存在上述任何缺点?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Dave    15 年前

    做一张单独的桌子 VEHICLE_TYPE VEHICLE 桌子通过。外键。然后从 车辆类型 String . 打电话时 vehicle.setVehicleType() InvalidArgumentException

    现在在对象中有了验证。而且,我也不想参加一个骗局。不参加会议,你什么都做不了。所以你有很多桌子。

        2
  •  1
  •   Pau    15 年前

    对于第二个con,如果性能非常重要,可以使用以下方法之一:

    1. 如果该类型的车辆在应用程序中使用不多,请延迟加载该类型的车辆。

        3
  •  1
  •   HLGEM    15 年前

    制作一个单独的表Vehicle_type(Vehicle_type_id int,description varchar(需要确定合适的大小))作为下拉菜单的查找。如果要在查找更改时更改主表中的值(例如adimin将seden更改为sedan),请将类型ID存储在车辆表中。如果希望这是历史数据(可能不再有轿车类型,但旧车辆仍应标记为轿车),则将该类型的说明存储在车辆表中。在第二种情况下,不能强制使用FK关系,因此需要确保插入(仅更新该值)不能选择当前不在表中的值。应用程序可能会这样做,但如果值可能在应用程序外部更改,则可以编写触发器来执行此操作。

        4
  •  1
  •   mdma    15 年前

    我不认为连接应该是您担心的原因-您很可能会发现,为了减少连接的开销而牺牲设计很可能是浪费精力。您到数据库的网络延迟可能高于连接开销。

    如何处理用户输入的附加值取决于您希望如何处理它们:

    1. 将它们视为真正的附加值。它们将添加到数据库中的车辆类型中,添加后,可供所有用户选择。

    2. 将它们视为特定字段的自定义值。一、 e.车辆类型包括“其他”类型,用户可以在单独的字段中输入其他详细信息。它们不会与其他用户共享,也不会显示在下拉列表中。

    您可以将车辆ID存储为常规密钥,或类型字符串本身(RW、FW等)。如果使用类型字符串本身,则不必连接到VEHICLE_type表。您可以直接呈现字符串,如果需要本地化,也可以从资源包中获取表示字符串。

    编辑:要查看ORM和OIM如何将模型验证元数据返回到db并输出到UI,请参见DZone: Hibernate 4 Validation ,和 Metawidget . 使用JSR 303,您可以在UI、业务层和后端验证对象。