J'ai réfléchi un peu à cela en essayant d'être positif et en justifiant la nécessité d'utiliser une valeur arbitraire au lieu d'une valeur nulle et il ne semble (au moins) pas y avoir de raison valable, sauf peut-être dans un ensemble de données d'exploration de données fermé pour améliorer et simplifier les performances et les requêtes, puis uniquement dans les cas où les nombres ne sont pas des valeurs susceptibles de fausser les données. Même cela devrait être examiné attentivement. Dans toutes les situations réelles, attribuer une valeur à null n'est pas une bonne pratique. Cela transforme une définition de colonne NOT NULL de votre ami à votre ennemi car ce n'est vraiment pas vrai.
C'est une chose très différente de dire que notre application ne doit pas accepter une valeur NULL pour certaines (ou même toutes) les colonnes. C'est une pratique judicieuse et bonne et il y a des avantages bien documentés à ne pas autoriser les valeurs nulles (clés et index et calculs statistiques par exemple). Cependant, assigner une valeur à "s'asseoir à la place" d'un null n'est pas du tout la même. C'est la tige pour votre propre dos, car vous devez d'abord sélectionner une valeur qui ne sera jamais utilisée, filtrer cette valeur comme vous le feriez et ne pas oublier de ne pas l'utiliser dans les calculs et les résumés et de la supprimer des flux de données externes . C'est au moins aussi mauvais d'utiliser un null pour représenter une valeur réelle, ce que vous vous dites que vous évitez, mais vous ne l'êtes pas.
La plupart des problèmes causés par les valeurs nulles, une fois compris, peuvent être traités (meilleure normalisation, index fonctionnels ou bitmap ou avec un simple WHERE x IS NOT NULL). Pensez-vous que dans une grande entreprise de télécommunications ou sur Amazon lors de la réunion mensuelle sur les performances, certains administrateurs de base de données décrivent ce grand plan pour accélérer un peu les requêtes sur leurs énormes ensembles de données "en remplaçant null par une valeur arbitraire, quelque chose comme -5000, ou autre - Je suis ouvert sur la valeur ... ". Ou pensez-vous qu'ils passent leur temps partagé entre une meilleure conception d'application pour filtrer les valeurs nulles indésirables et l'optimisation des requêtes en fonction des données réelles qui leur sont fournies ? OK, peut-être qu'une réunion mensuelle est un peu optimiste, mais chaque fois que cela se produit, je peux vous assurer que "Remplacer les valeurs nulles par -5000 (ou autre) pour une meilleure API" n'est pas un point de l'ordre du jour.
Pour moi, c'est bien de dire que je n'accepterai pas de données manquantes (vous devez avoir un âge ou un prix ou un code de région ou autre) et parfois même bien de dire que pour cette colonne il y a une valeur par défaut qui sera entrée si vous ne mettez pas autre chose. Il n'est pas bien de mettre de côté une valeur pour signifier nulle. Considérez les champs du deuxième prénom comme exemple. Parfois, ceux-ci n'existeront pas car les parents sont trop paresseux pour remplir toutes les cases. Ajoutons-nous "aucun" ou "manquant" ou "inconnu" à nos données pour améliorer nos recherches? Non, car il peut y avoir des personnes étranges qui changent leurs noms en ces valeurs et donc lorsque nous imprimons les données, nous ne savons pas si nous devons les inclure ou non. Il s'agit d'un exemple simple mais d'une grande portée. Nous connaissons NULL et avons des fonctions intégrées prévisibles pour y faire face. Vous ne pouvez pas mieux coder cela.
Si aucune réponse (ou NULL) n'est pas une réponse valide à votre demande d'entrée, ne l'autorisez pas dans l'application ou dans la base de données, si c'est une bonne réponse, vous devez l'autoriser dans votre application et votre base de données et gérer comme une réponse valide. S'il fait partie d'un ensemble de réponses valides, votre base de données doit être conçue pour le stocker. Après tout, vous ne dites pas bon, les champs numériques sont si ennuyeux que de stocker des nombres dans des blobs et d'utiliser des photos d'animaux sauvages pour représenter chaque nombre, parce que c'est fou (cool mais fou). Nous ne décidons pas non plus que nous n'aimons pas la lettre B, et comme un cauchemar cruel de Sesame Street, remplacez-le par un # dans nos données. Si B n'est pas une réponse que nous voulons, nous disons à l'utilisateur "Hé, vous ne pouvez pas mettre un B ici". Alors pourquoi traiter null différemment?
Évitez donc les valeurs nulles que vous ne voulez pas au niveau de l'application et traitez-les dans votre base de données où vous les acceptez autrement, aussi sûr que girafe + giraffe = hippo, votre manipulation de données inutile vous causera des ennuis.