I don't think associations should be a cause for concern - you may well find that compromising a design to reduce JOIN overhead is likely to be wasted. The latency of your network in db may be higher than the JOIN overhead.
How you deal with additional values entered by the user depends on how you want to handle them:
Treat them as true complementary values. They are added to VEHICLE_TYPE in the database and after they are added are available to all users.
Treat them as custom values for this particular field. That is, VEHICLE_TYPE includes the type "Other", and the user can enter additional data in a separate field. They are not shared with other users and are not displayed in the drop-down list.
To get object level validation, check it at VEHICLE_TYPE. This can be done automatically using modern OIM and ORM structures. This allows you to define model validation rules, which then propagate forward to the user interface for early detection of validation errors and back to the database to ensure data warehouse consistency.
You can save the vehicle identifier as a regular key or the string itself (RW, FW, etc.). If you use a type string, you do not need to join the VEHICLE_TYPE table. You can present a string directly or you can get presentation strings from resource packages if localization is required.
EDIT: to see how ORM and OIM can return model validation metadata back to db and exit the user interface, see DZone: Hibernate 4 Validation and Metawidget . With JSR 303, you can test your objects in the user interface, business layer, and at the end.
source share