En dehors de la question de savoir si les NULL doivent être utilisés ou non : Je suis responsable d'une base de données existante qui utilise NULL pour signifier "données manquantes ou jamais saisies". C'est différent de la chaîne vide, qui signifie "un utilisateur a défini cette valeur, et il a choisi 'vide'".
Un autre contractant du projet est fermement convaincu que les NULL n'existent pas pour moi, que je ne les utilise jamais et que personne d'autre ne devrait le faire. Cependant, ce qui me trouble, c'est que, puisque l'équipe du contractant reconnaît la différence entre "manquant/non saisi" et "intentionnellement vide ou indiqué par l'utilisateur comme inconnu", elle utilise un seul caractère "Z" dans tout son code et ses procédures stockées pour représenter "manquant/non saisi" avec la même signification que NULL dans le reste de la base de données.
Bien que notre client commun ait demandé que cela soit modifié et que j'aie appuyé cette demande, l'équipe considère qu'il s'agit d'une "pratique standard" parmi les DBA beaucoup plus avancés que moi ; ils sont réticents à changer pour utiliser les NULL sur la base de ma seule demande ignorante. Alors, quelqu'un peut-il m'aider à surmonter mon ignorance ? Existe-t-il une norme, un petit groupe d'individus, ou même une seule voix forte parmi les experts SQL qui préconise l'utilisation de 'Z' à la place de NULL ?
Mise à jour
J'ai une réponse de l'entrepreneur à ajouter. Voici ce qu'il a dit lorsque le client a demandé à ce que les valeurs spéciales soient supprimées pour permettre les NULL dans les colonnes sans données :
En fait, j'ai conçu la base de données pour éviter les NULLs dans la mesure du possible. Voici le raisonnement :
- Un NULL dans un champ [VARCHAR] de type chaîne n'est jamais nécessaire car une chaîne vide (de longueur nulle) fournit exactement les mêmes informations.
- Un NULL dans un champ entier (par exemple, une valeur d'identification) peut être traité en utilisant une valeur qui n'apparaîtrait jamais dans les données (par exemple, -1 pour un champ entier d'IDENTITÉ).
- Un NULL dans un champ de date peut facilement entraîner des complications dans les calculs de date. Par exemple, dans la logique qui calcule les différences de date, comme la différence en jours entre une [RecoveryDate] et une [OnsetDate], la logique va exploser si l'une ou les deux dates sont NULL - à moins qu'une tolérance explicite ne soit faite pour que les deux dates soient NULL. C'est un travail supplémentaire et une manipulation supplémentaire. Si des dates "par défaut" ou "fictives" sont utilisées pour [RecoveryDate] et [OnsetDate] (par exemple, "1/1/1900"), les calculs mathématiques peuvent donner des valeurs "inhabituelles", mais la logique des dates ne sera pas perturbée.
La gestion des NULL est traditionnellement un domaine où les développeurs font des erreurs dans les procédures stockées.
Au cours de mes 15 années d'expérience en tant que DBA, j'ai constaté qu'il était préférable d'éviter les NULL dans la mesure du possible.
Cela semble valider la réaction majoritairement négative à cette question. Au lieu d'appliquer une approche 6NF acceptée pour concevoir l'élimination des NULL, des valeurs spéciales sont utilisées pour "éviter les NULL dans la mesure du possible". J'ai posé cette question avec un esprit ouvert, et je suis heureux d'en avoir appris davantage sur le débat "les NULL sont utiles / les NULL sont diaboliques", mais je suis maintenant assez à l'aise pour qualifier l'approche des "valeurs spéciales" de non-sens total.
une chaîne vide (de longueur nulle) fournit exactement la même information.
Non, ce n'est pas le cas ; dans la base de données existante que nous modifions, NULL signifie "jamais saisi" et chaîne vide signifie "saisi comme vide".
La gestion des NULL est traditionnellement un domaine où les développeurs font des erreurs dans les procédures stockées.
Oui, mais ces erreurs ont été commises des milliers de fois par des milliers de développeurs, et les leçons et mises en garde pour éviter ces erreurs sont connues et documentées. Comme cela a été mentionné ici : que vous acceptiez ou rejetiez les NULLs, la représentation des valeurs manquantes est un problème de sécurité. problème résolu . Il n'est pas nécessaire d'inventer une nouvelle solution simplement parce que les développeurs continuent à faire des erreurs faciles à surmonter (et à identifier).
En guise de note de bas de page : je suis un DBE et un développeur depuis plus de 20 ans (ce qui est certainement suffisant pour que je connaisse la différence entre un ingénieur de base de données et un administrateur de base de données). Tout au long de ma carrière, j'ai toujours été dans le camp des "NULLs are useful", même si je savais que plusieurs personnes très intelligentes n'étaient pas d'accord. J'étais extrêmement sceptique quant à l'approche des "valeurs spéciales", mais je n'étais pas assez bien informé sur "How To Avoid NULL the Right Way" pour prendre une position ferme. J'aime toujours apprendre de nouvelles choses - et j'ai encore beaucoup à apprendre après 20 ans. Merci à tous ceux qui ont contribué à rendre cette discussion utile.