5 votes

.NET : Autoriser les NULS dans les champs de la base de données ?

J'ai la tâche de refactorer une DB SQLServer..... Un grand nombre de tables et de colonnes "AUTORISENT LES NULS". Est-ce une bonne pratique ?

Je crois me souvenir que l'auteur de CSLA.NET a déclaré que c'était une très mauvaise pratique d'autoriser les valeurs nulles dans une base de données...

Si c'est le cas, quelles sont mes alternatives ?

Supprimez tous les "ALLOW NULLS" de toutes les colonnes.... et dans les colonnes numériques, utilisez une valeur de -1 par exemple... ?

J'apprécierais vraiment toute contribution de votre part.

J'utilise actuellement un modèle (de entity framework) à partir de ma base de données et les colonnes de la base de données qui "ALLOW NULLS" sont nulles ... et certaines des procédures stockées exigent que j'aie une valeur par défaut ... c'est-à-dire que BOOLEAN exige FALSE comme valeur par défaut ... mais elle est nulle ...

Je ne veux pas m'éloigner de ma question initiale, mais les ALLOW NULLS sont une mauvaise chose d'après ce que j'ai compris ..... Alors comment puis-je résoudre ce problème ?

Toute aide est la bienvenue.

8voto

Mike Mooney Points 5841

Il ne fait aucun doute que les NULL doivent être évités lorsque cela est possible, en raison des problèmes qu'ils peuvent introduire plusieurs problèmes d'indexation et de syntaxe de requête.

En raison des problèmes que peuvent poser les NULL, des pressions ont été exercées pour qu'ils ne soient plus utilisés. Cependant, comme la plupart des mouvements de ce type, il est devenu incontrôlable, au point que certaines personnes insistent fanatiquement pour que les NULL ne soient jamais utilisés dans les bases de données. J'ai fait partie de ce camp pendant de nombreuses années, avant de trouver qu'il était un peu trop zélé.

La réponse se situe quelque part entre les deux. Les NULL doivent être évités autant que possible, mais il existe effectivement des raisons commerciales valables pour les stocker.

Souvent, vous avez besoin de stocker une valeur numérique facultative, et beaucoup de gens vous diront de simplement stocker un zéro pour indiquer "aucune valeur", mais c'est un anti-modèle encore pire de stocker une valeur magique qui signifie vraiment autre chose. Et si vous ne pouvez pas utiliser le zéro pour un champ, parce que le zéro est également considéré comme une valeur significative, ou parce que cette valeur est utilisée comme multiple d'un diviseur, vous devez donc utiliser une autre valeur magique (-1 ?) pour ce champ dans ce cas précis, et maintenant vous avez un problème encore plus grave, parce que tous vos champs numériques facultatifs se comportent maintenant différemment. Oye.

Les dates sont un candidat encore plus convaincant pour les champs annulables. La "valeur nulle" standard que les gens utilisent dans .NET est la valeur par défaut non attribuée de DateTime, qui est DateTime.MinValue, ou plus précisément le 1er janvier 0001. Cependant, vous ne pouvez pas écrire cette valeur magique dans la base de données SQL car la valeur minimale par défaut pour un champ DATETIME du serveur SQL est le 1er janvier 1973. Vous devez maintenant vérifier que vous convertissez correctement ces valeurs lorsqu'elles sont écrites et lues dans la base de données, et vous devez disposer d'un codage défensif qui vérifie partout si vos champs de date sont inférieurs à SqlDateTime.MinValue, au lieu de simplement vérifier s'ils sont égaux à DateTime.MinValue. Double Oye.

Je préfère traiter les valeurs telles qu'elles sont réellement, et ne pas construire un grand nombre de constructions artificielles pour cacher la véritable signification et l'utilisation du champ. Si un champ peut très bien ne pas avoir de valeur, rendez-le annulable, et rendez-le également annulable dans vos objets d'application (si votre langage supporte une telle chose). Ensuite, à chaque fois que vous utilisez ce champ, vous êtes obligé de réfléchir à ce qu'il faut faire dans le cas où il est NULL, mais c'est en fait une bonne chose. En règle générale, je suis opposé à ce que les développeurs gaspillent leurs neurones dans la complexité inutile du code, mais c'est parce que cela détourne l'attention du véritable problème à résoudre ; cependant, dans ce cas, l'absence de valeur fait partie du véritable problème et doit être prise en compte. Si vous vous contentez de définir ces valeurs par défaut, le développeur qui écrit une formule ou un algorithme sera moins enclin à réfléchir aux conditions limites dans lesquelles les valeurs sont manquantes, et il ne se rendra peut-être même pas compte à ce moment-là qu'il est possible que ces valeurs soient manquantes.

1voto

amelvin Points 6028

Null est parfois une valeur de colonne valide, mais je dirais qu'une meilleure pratique serait plutôt d'ajouter des valeurs par défaut et de faire en sorte que la colonne ne soit pas nulle.

Si vous avez des données existantes à prendre en compte, vous devrez effectuer une mise à jour comme suit :

update TableA set ColumnA = 'default value' where ColumnA is null 

... si vous voulez imposer la mention "non nul" à des données existantes.

S'il n'y a pas de valeur par défaut raisonnable, null peut être une valeur de colonne parfaitement valide - mais il y a très souvent une valeur par défaut décente disponible.

1voto

James Westgate Points 6789

L'utilisation d'une valeur nulle est un cas où une légère dénormalisation peut apporter un grand avantage en termes de performances. Dans le monde réel, une valeur NULL est une manière parfaitement valide de dire qu'une valeur n'a pas été enregistrée. enregistrée. Ceci est particulièrement pertinent pour les valeurs booléennes (BIT) et les valeurs numériques facultatives.

Les puristes vous demanderont de créer une nouvelle table avec une jointure gauche pour enregistrer cette valeur. Les réalistes modifieront la table existante et ajouteront une valeur nulle.

Il y a certainement des cas où les valeurs nulles sont pertinentes. Le générique Nullable a été ajouté au framework .net pour les types de valeurs pour exactement la même raison.

-4voto

Marcelo Cantos Points 91211

Les NULL sont une plaie sur le visage de l'humanité qui devrait être éradiquée de l'existence. Malheureusement, les systèmes et langages actuels (en particulier SQL) ne sont pas en mesure de s'adapter à une révision aussi radicale de la pensée actuelle. En fait, SQL est l'un des principaux responsables de cette parodie.

Dans le monde réel, le conseil que je donnerais est donc d'éviter les NULL autant que possible, mais d'accepter la réalité que parfois il n'y a pas d'alternative facile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X