Disons que vous avez une application qui a un champ booléen dans sa User
table appelé Inactive
.
Y a-t-il quelque chose de fondamentalement mauvais à simplement stocker false comme nul? Si oui, pouvez-vous s'il vous plaît expliquer quel devrait être le côté négatif? J'ai discuté de cela avec quelqu'un il y a quelques mois et nous avons tous deux convenu que cela ne devrait pas avoir d'importance tant que vous le faites de manière cohérente dans l'application / la base de données. Récemment, quelqu'un que je connais a insisté sur le fait que "vrai" true
ou false
devrait être utilisé, mais ils n'ont pas vraiment expliqué pourquoi.
database-design
null
Ominus
la source
la source
Null is a special marker used in Structured Query Language (SQL) to indicate that a data value does not exist in the database
c'est la sagesse acceptée et vous ne devriez pas redéfinir ce que signifie Null dans votre application. Ce sera déroutant pour tous les autres utilisateurs de votre code.SELECT * FROM foo WHERE bar = FALSE
ne donne pas les résultats que vous attendez.Réponses:
Oui.
NULL n'est pas identique à False.
Par définition, les comparaisons (et la logique) qui impliquent NULL doivent renvoyer des valeurs de NULL (pas False). Cependant, les implémentations SQL peuvent varier.
True and NULL
est NULL (pas False).True and NULL or False
est NULL (pas False).http://en.wikipedia.org/wiki/Null_(SQL)#Three-valued_logic_.283VL.29
http://technet.microsoft.com/en-us/library/cc966426.aspx
la source
null
n'est pas pertinent pour la logique (comme c'est le cas danswhatever OR TRUE
ouwhatever AND FALSE
, où aucune valeur dewhatever
ne peut changer la condition), alors l'expression renvoie une valeur. Ce n'est pas une optimisation; c'est ainsi que fonctionne la logique à 3 valeurs . Tout SGBD qui insiste pour retournerUNKNOWN
/NULL
pour ces expressions est fondamentalement cassé.En autorisant les valeurs nulles dans un champ booléen, vous transformez une représentation binaire voulue (vrai / faux) en une représentation à trois états (vrai, faux, nul) où vos entrées «nulles» sont indéterminées. La valeur «nulle» n'est ni «vrai» ni «faux». Quelle raison auriez-vous à augmenter votre représentation pour être inexacte?
Même si vous décidez d'un modèle comme celui-ci et que vous le faites de manière cohérente tout au long de votre application, cela ne vous convient pas. Vous vous retrouverez dans une situation où il n'est pas clair pour les yeux frais pourquoi ce modèle est en place ou, plus probablement, vous vous retrouverez dans une situation où ce modèle est accidentellement cassé.
la source
Ce que les autres ont dit. 3 valeurs possibles n'est pas un booléen.
Mais vous pouvez avoir un besoin légitime de 3 valeurs. Tels que (vrai, faux, inconnu). Même si c'est le cas, si vous êtes dans l'ultra-normalisation, vous n'accepterez aucune valeur nulle. Au lieu de cela, vous stockerez un vrai booléen dans une autre table avec une relation 1 à 1. Une valeur nulle peut être produite dans une requête par une jointure externe "ayant échoué", et non par une valeur nulle stockée physiquement.
la source
false
), alors ils ont leur place. S'ils ne le faisaient pas, ils n'existeraient pas. L'alternative, comme mentionné, est essentiellement d'avoir une toute autre table avec juste la clé primaire de votre ligne et un seul booléen (ou int, ou varchar, ou ce que vous avez). Pour chaque champ que vous auriez autrement rendu nullable. Relativement pur, il est trop alambiqué pour la plupart des usages.Est-ce
bool?
un type booléen? Non. C'est du typeNullable<T>
oùT
est booléen. Un booléen nullable peut avoir 3 valeurs: true, false et null. À utiliserbool
oubool?
dépend de vos besoins. Il peut y avoir une raison légitime pour laquelle vous devrez peut-être utiliser null mais un type qui sent binaire mais vous ne connaissez pas la réponse. Dans l'exemple ci-dessus,User.IsActive
semble clair. L'utilisateur est actif ou non. En tant que système, il peut vouloir savoir si un utilisateur est actif ou non. Il ne devrait pas y avoir «peut-être». Mais pensez à quelque chose comme un indicateur de fonctionnalité. La fonction est-elle activée? Les réponses pourraient être oui, non ou incertaines. Vous pouvez avoir une règle métier qui indique clairement que le bouton n'est affiché que lorsque l'indicateur est défini sur true. On peut soutenir que bool est faux par défaut, alors pourquoi créer un bool nullable? Inversez l'exigence: allez-vous définir toutes les valeurs de la source de données sur true?la source