Cuando usamos persistencia en Java, se recomienda que cuando un campo pertenecerá a una serie de combinaciones se use un enum, ya que contaremos dentro de nuestro software con las ventajas de estos elementos enumerados, permitiendo mapear el valor con un campo de la tabla. Para ello, java nos permite usar la anotación Enumerated.

@javax.persistence.Enumerated

Esta anotación, marca nuestro campo como un dato enumerado, que puede ser de 2 tipos:

  • Enumerated.ORDINAL (Tipo de enum por defecto)
  • Enumerated.STRING

Cada tipo, tiene sus ventajas e inconvenientes, como veremos a continuación, por lo que depende del uso que se vayamos a dar a ese enum lo que nos hará decidir que tipo usar.

Enumerated.ORDINAL

  • Es rápido y eficiente, dado que se mapeará a un valor integral en base de datos.
  • Dado que el valor asignado a cada enum será el entero asociado a su posición, no podemos reordenarlos sin romper la integridad de los valores ya asignados a la base de datos.
  • Podemos renombrar el campo enum sin afectar a la integridad de la base de datos.

Enumerated.STRING

  • Aporta un grado de legibilidad a la base de datos y facilidad para saber que datos se almacenan por otros usuarios de la base de datos *.
  • Es más lento ya que relacionará el enum a un valor de la base de datos de tipo String.
  • Se puede reordenar sin afectar a la integridad de la base de datos, pero no se puede cambiar el nombre del enum.

Podemos ver más claro cómo decidir el uso en el siguiente ejemplo:

UserStates, será un enum que representará el valor asignado al estado del usuario, tendrá una forma como esta. Su mejor tipo de enum es Enumerated.ORDINAL, nos permitirá renombrar los nombres de los estados y añadir los que queramos, dado que el orden en este caso no es importante:

public enum UserStates { ACTIVE, DELETED, PENDING }

Planets, este enum representará el listado de planetas del sistema solar actuales (del que ya sabemos que se sacan y meten planetas a antojo), por lo que su mejor tipo de enum es Enumerated.STRING, lo que nos permitirá cambiar el orden en caso de que se añadan o se eliminen planetas.

public enum Planets {MERCURY,VENUS,EARTH,MARS,JUPITER,SATURN,URANUS,NEPTUNE,PLUTO,NINE}

Legibilidad

Sobre el tema de la legibilidad, que es tanto defendido como criticado, yo soy partidario de que es mejor que esté bien documentada la tabla y lo que se guarde realmente sea el entero siempre que sea razonable. Pensemos que la ventaja de velocidad no es tanta como la espacio disponible, el mapeo de estos dos enums en una tabla sería similar al siguiente. Imaginemos que tenemos 100mil usuarios, de los cuales 80mil, están activos (El State en base de datos es 1), y además son del planeta Tierra (Name del planet es «EARTH»)

Veamos ahora la diferencia entre los dos valores de una manera más gráfica

  • Estamos guardando 80mil veces un 1, para representar el usuario activo.
  • Estamos guardando 80mil veces la cadena «EARTH», para representar el planeta favorito del usuario.

En mi caso, prefiero guardar un valor numérico y indicar en un comentario en la tabla los valores disponibles para ese campo, lo cual mejoraría el tamaño de los datos recuperados por una consulta.

USERSTATE
------------
ID | STATE |
------------
1 | 1
2 | 2
3 | 1

PLANETS
------------
ID | Name |
------------
1 | EARTH
2 | EARTH
3 | MARS
4 | EARTH

 

Enums con JPA (Enumerated.ORDINAL vs Enumerated.STRING)
Etiquetado en:            

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Social media & sharing icons powered by UltimatelySocial