2009-04-10 12 views
4

Il est généralement recommandé d'utiliser des constantes nommées à la place des nombres magiques, mais cela est fastidieux et sujet aux erreurs en conservant une table de référence de base de données et un fichier de constantes nommées en synchronisation. Existe-t-il un moyen facile de synchroniser ces deux sources pour cette information, ou est-ce que je néglige une amélioration de conception évidente?Meilleure pratique pour synchroniser les constantes nommées dans les tables de référence de code et de base de données?

Si ma question n'est pas claire, voici un exemple. J'ai une table de référence avec 2 colonnes:

UserStatus 
---------- 
UserStatusID 
UserStatus 

Donc, ce tableau associe un UsersStatusID 1 avec le UserStatus 'Active'. La table User repose sur cette table pour normaliser UserStatuses.

Ainsi, lorsque l'interrogation pour le statut du code d'un utilisateur, j'ai deux options:

SELECT UserStatusID FROM Users WHERE UserStatus = 1 

OU

SELECT UserStatusID FROM Users WHERE UserStatus = ACTIVE_USER_STATUS_ID 

meilleure pratique consiste à utiliser ce dernier de sorte que le sens du nombre 1 est clair . Mais cela signifie que je dois maintenir une liste complète des UserStatusID valides dans ma table UserStatus et dans mon code. Comment éviter d'avoir à garder à la fois la table de référence DB et le fichier de constantes mis à jour? J'utilise un fichier de constantes centralisé donc il n'y a que 1 place à mettre à jour pour mon code, mais y a-t-il un moyen d'éviter de mettre à jour un fichier de constantes quand un nouveau statut est introduit?

Je n'ai qu'une idée: Programmer un script à exécuter une fois par jour pour remplir un fichier de constantes via une requête des tables de référence dans la base de données. Est-ce la meilleure solution?

Répondre

3

Gardez vos constantes dans la base de données. Interrogez-les au besoin.

Si les performances sont un problème, chargez toutes les constantes des constantes au démarrage de l'application dans une structure de données interne, puis utilisez-les dans toute l'application.

Ainsi, votre exemple de code serait:

SELECT UserStatusID 
FROM Users 
WHERE UserStatus = (
        SELECT INTEGER_VALUE 
        from DB_CONSTANTS 
        WHERE CONSTANT_ID = 'ACTIVE_USER_STATUS_ID' 
        ) 

Ou, si vous utilisez une structure interne, il serait plus comme ceci:

SELECT UserStatusID 
FROM Users 
WHERE UserStatus = g_Constants.ActiveUserStatusID; 
Questions connexes