2009-09-24 8 views
8

Pour moi, la sagesse classique est de stocker des valeurs enum (OrderStatus, UserTypes, etc) comme tables de recherche dans votre base de données. Cela me permet de renforcer l'intégrité des données dans la base de données, en empêchant les valeurs fausses ou nulles, etc.Enums dans la DB ou NO Enums dans la DB

Cependant, de plus en plus, cela ressemble à une duplication inutile pour moi. Non seulement dois-je créer des tables pour ces valeurs (ou avoir une table de consultation centrale lourde), mais si je veux ajouter une valeur, je dois me rappeler de l'ajouter à 2 (ou plus, comptant la production, les essais,) et les choses peuvent se désynchroniser facilement.

J'ai encore du mal à relâcher les tables de recherche.

Je sais qu'il y a probablement certains scénarios où l'un a un avantage sur l'autre, mais quelles sont vos pensées générales?

Répondre

4

J'ai fait les deux, mais je préfère maintenant les définir comme dans les classes de code.

Les nouveaux fichiers ne coûtent rien, et les avantages que vous recherchez en les intégrant dans la base de données doivent être traités comme des règles métier.

En outre, j'ai une aversion pour la conservation des données dans une base de données qui ne change pas vraiment. Et il semble qu'une énumération corresponde à cette description. Cela n'a pas de sens pour moi d'avoir une table de consultation des États, mais une classe d'énumération des États a du sens pour moi.

+0

Comment gérez-vous le fait qu'aucune ligne n'a une valeur invalide pour leur énumération? Juste en utilisant le code qui accède à la base de données? –

1

Je les mets dans la base de données, mais je ne peux vraiment pas défendre pourquoi je le fais. Cela "semble juste". Je suppose que je le justifie en disant qu'il y a toujours une «bonne» version de ce que les enums peuvent être en vérifiant la base de données.

2

S'il doit être maintenu, je les laisserais dans une table de recherche dans la base de données. Même si je pense qu'ils n'auront pas besoin d'être entretenus, j'irais toujours vers une table de consultation, de sorte que si je me trompe, ce n'est pas grave.

EDIT:

Je tiens à préciser que si le Enum ne fait pas partie du modèle DB alors je laisse dans le code.

+0

Qu'est-ce qui ne serait pas considéré comme faisant partie du modèle DB? –

+0

Tout ce qui n'est pas stocké dans la base de données dans le cadre d'une entrée d'enregistrement dans une table. – klabranche

1

dépendances de schéma doivent être stockés dans la base de données elle-même pour assurer que toutes les modifications apportées à votre architecture peut être facilement effectuer de manière transparente à l'application ..

1

Je préfère énumérations qu'il applique la liaison anticipée des valeurs dans le code, de sorte que les exceptions ne sont pas causés par des valeurs manquantes

Il est également utile si vous pouvez utiliser la génération de code qui peut amener les associations des colonnes entières à un type d'énumération, de sorte qu'en logique métier, vous ne devez traiter que des valeurs d'énumération facilement mémorisables .

1

Considérez cela comme une forme de documentation.

Si vous avez déjà documenté correctement les constantes enum dans le code qui utilise le dB, avez-vous vraiment besoin d'un ensemble de documentation en double (à utiliser et à maintenir)?

+2

En y réfléchissant un peu plus, je suppose que cela revient à penser à une application pilotée par une base de données ou une application qui utilise une base de données pour stocker son état.Ce que je veux dire, c'est de considérer la base de données comme une entité indépendante, qui peut être utilisée par d'autres applications ou services, auquel cas l'intégrité des données est essentielle. Versus ayant la base de données comme un simple magasin de données pour l'application, en s'appuyant sur l'application pour appliquer les règles d'intégrité des données. Dans ce cas, les relations ne sont probablement même pas nécessaires. –