2009-06-26 10 views
5

Dans le code on peut spécifier globalement les constantes accessibles/enums/etc une fois que cela peut ensuite être réutilisé à travers l'application. Cela donne la possibilité d'utiliser des noms significatifs comme 'Mazda' au lieu de nombres comme '2'.Se débarrasser des nombres "Magic" dans SQL Server

Nous aimerions faire de même avec nos procédures stockées SQL Server, mais nous ne sommes pas sûrs de la meilleure façon de l'implémenter.

Par exemple, pour les tableaux suivants (Le schéma voiture proverbiale):

Car  ManufacturerId 
350Z  1 
Hilux  2 
Yaris  2 

ManufacturerId Name 
1    Nissan 
2    Toyota 

Ainsi, au lieu d'écrire

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan 

Nous voudrions écrire quelque chose comme

SELECT * FROM Car WHERE ManufacturerId = @Nissan 

Une restriction nous avons est que nous ne pouvons pas compter sur le Manufacturer.Name rester le même pour la vie de l'App. Nous avons pensé d'avoir une colonne « Code » qui ne change jamais et les jointures sont recherchés comme ceci:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId 
WHERE m.Code = 'Nissan' 

Je suis un peu hésitant sur ce qu'il utilise un supplément de jointure et les comparaisons de chaînes qui peuvent être mal orthographiés .

Quelle est la meilleure façon d'y parvenir sans avoir à déclarer les variables dans chaque procédure stockée?

Répondre

4

Nous avons fait deux manières:

  • fonction définie par l'utilisateur qui renvoie le « nombre magique » par son nom.
  • Utilisez une colonne nchar (4) à la place de la colonne int et créez des codes légèrement moins impénétrables. Donc, Nissan serait "NISN" au lieu de 1. Un peu plus agréable.
+0

Joué avec la première suggestion, mais il est trop tard pour le second. Peut-être la prochaine fois. –

+0

La chose qui devient difficile avec ce problème est que le nombre magique correspond généralement à une énumération dans votre code client. À un certain moment, vous allez bousiller la synchronisation de votre recherche SQL avec le client enum. MS SQL Server offre ici un point d'intégration très ordonné: vous pouvez coder une UDF CLR pour renvoyer la valeur enum, en appliquant essentiellement une certaine sécurité de type à l'exécution. Vous devez toujours vous assurer que vos requêtes obtiennent les noms des valeurs enum, cependant, je n'ai jamais trouvé un moyen de contourner cette partie du problème. –

1

Vous n'avez pas besoin de stocker des numéros dans la base de données. Il y a des administrateurs DB qui aiment toujours l'idée de «clés naturelles». Au lieu d'utiliser un ID, ils utilisent simplement une clé naturelle qui définit uniquement le fabricant. Cela peut souvent conduire à plusieurs clés primaires. Vous pourriez avoir besoin d'un «Canada» Mazda comme identificateur unique pour le fabricant.

Personnellement, je n'aime pas cette méthode et préfère avoir un identifiant unique pour chaque objet identifiable stocké dans mes tables. Cela signifie créer une nouvelle table qui est une recherche. 2, 'Mazada'. Ensuite, vous pouvez créer une vue qui tire "Mazda" là où il y a 2 dans la base de données, puis exécutez la requête sur la vue. SELECT * de v_cars où maker = 'Mazda'

+0

En plus d'être trop tard pour changer l'arrangement, je suis d'accord avec vous pour ne pas utiliser les clés naturelles dans ces cas, car il est plus facile d'utiliser des énumérations dans le code. J'aime l'idée de voir. –

Questions connexes