JPA Enum ORDINAL vs STRING

Il est possible de définir des énumérations dans JPA en utilisant soit

@Enumerated(EnumType.ORDINAL) 

ou

 @Enumerated(EnumType.STRING) 

Je me demande quels sont les avantages et les inconvénients de ces deux définitions?

J’ai entendu dire que ORDINAL est plus performant (plus rapide) que STRING avec EclipseLink.
Est-ce vrai?

Je vais toujours STRING .

La vitesse est rarement le problème le plus important – la lisibilité et la maintenabilité sont plus importantes.

J’utilise STRING car il est beaucoup plus facile d’inspecter manuellement les lignes de la firebase database, mais plus important encore, je peux faire deux choses sans toucher à la firebase database, l’ ORDINAL ne peut pas gérer:

  1. Je peux changer l’ ordre de mes enums
  2. Je peux insérer de nouvelles énumérations au milieu de la liste enum

Ces deux modifications vont modifier les valeurs ordinales des énumérations déjà utilisées dans la firebase database, cassant ainsi les données existantes si vous utilisez ORDINAL .

Si vous modifiez une valeur enum (pas si courante), la gestion est simple:

 UPDATE table SET enum_column = 'NEW_ENUM_NAME' where enum_column = 'OLD_ENUM_NAME'; 

Il est probable que ORDINAL soit plus efficace, mais c’est mineur. Il y a quelques inconvénients à ORDINAL :

  • il est moins lisible dans la firebase database
  • Si vous réorganisez vos définitions d’énumération, la firebase database ne sera pas cohérente.

Avec STRING vous ne pouvez pas renommer vos énumérations.

Choisissez-en un et utilisez-le dans toute l’application – soyez cohérent.

Si votre firebase database va être utilisée par d’autres clients / langues – utilisez STRING , c’est plus lisible.

Je préfère l’utilisation d’ Ordinal mais cela dépend vraiment de l’utilisation .

Par exemple:

Vous avez une énumération, pour enregistrer tous vos états d’utilisateur, dans ce cas l’ordre n’a pas d’importance, et vous pouvez append plus d’états dans le futur (la meilleure utilisation est @Enumerated(EnumType.ORDINAL) ):

 public enum UserStates { ACTIVE, DELETED, PENDING } 

Mais maintenant, vous avez un enum, pour sauver les Plantes dans le système solaire (Best utilise @Enumerated(EnumType.STRING) ):

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

Maintenant, pensez que vous voulez réorganiser vos planètes, avec @Enumerated(EnumType.ORDINAL) vous ne pouvez pas, car votre firebase database ne peut pas connaître le nouvel ordre dans votre fichier Java.

Vous pouvez réorganiser vos Plantes en utilisant @Enumerated(EnumType.STRING) car votre planète est liée au nom enum et non à l’ordre enum.

Quoi qu’il en soit, vous pouvez modifier vos @Enumerated(EnumType.STRING) car elles sont liées à la commande, mais vous ne pouvez pas modifier vos @Enumerated(EnumType.STRING) car elles utiliseront comme de nouvelles énumérations.

Les types de chaînes sont plus lisibles dans la firebase database, mais leur taille dépassera celle des données ordinales. Peut-être sont-ils utiles si la firebase database est utilisée par plus de clients, mais mieux vaut avoir une bonne documentation du logiciel que de sauvegarder 1000 fois “EARTH” que “4”

 USERSTATE ------------ ID | STATE | ------------ 1 | 1 2 | 2 3 | 1 Planets ------------ ID | Name | ------------ 1 | EARTH 2 | EARTH 3 | MARS 4 | EARTH 

C’est une bonne question. Dans le passé, j’ai utilisé Ssortingng mais aujourd’hui, je préfère Ordinal.

Le principal inconvénient de la chaîne est pour les administrateurs de firebase database. Oui, les DBA. Avec la chaîne, ils n’ont aucune idée des valeurs possibles de la colonne. Cette information est dans le code de l’application. Seul l’administrateur de firebase database peut avoir une idée des valeurs possibles regroupant les informations existantes sur la table, mais il ne sera jamais sûr des autres valeurs possibles ou si de nouvelles valeurs sont ajoutées, jusqu’à ce que l’application les insère sur la table.

Dans l’Ordinal, vous avez le même problème. Mais ma préférence pour Ordinal est venue à la solution du problème de DBA qui semble naturel à la firebase database. Vous créez une nouvelle table pour afficher les valeurs possibles de l’énumérateur sur la firebase database, avec une clé étrangère entre la colonne (valeur enum ordinal) et cette nouvelle table. Cette stratégie est décrite et mise en œuvre ici .

En ce qui concerne le problème de quelqu’un qui pourrait réordonner l’énumérateur et casser le système, un simple test unitaire peut résoudre ce problème et garantir que personne ne les réorganisera sans un bon avertissement. La même idée est valide lors du renommage de l’énumérateur. Ainsi, renommer (sur Ssortingng) ou réorganiser (sur Ordinal) accidentellement n’est pas vraiment un argument de poids contre l’approche Ssortingng ou Ordinal.

En passant, les développeurs ont plus besoin de renommer que de réorganiser un énumérateur, c’est donc un point positif supplémentaire dans l’utilisation de Ordinal.

Ainsi, avec cette approche, vous résolvez le problème principal de l’ordinal (maintenant, est lisible), l’information occupera moins d’espace sur la firebase database et votre DBA sera content.

Cela dépend de votre application, s’il y a plus de chances que vous ajoutiez d’autres énumérations, utilisez le type Chaîne, s’il y a plus de chances que vous changiez le nom de vos énumérations, utilisez Ordinal.

Êtes-vous vraiment sûr qu’une firebase database lisible par l’homme est ce dont vous avez besoin? Stocker une valeur de chaîne est une perte de place. Le seul compromis avec la lisibilité pourrait être d’utiliser la colonne @Enumerated (STRING) et la firebase database de la carte comme ENUM (si vous utilisez mysql … Je présume que d’autres dbms ont quelque chose de similaire),