web-dev-qa-db-fra.com

Dois-je stocker False comme Null dans un champ de base de données booléenne?

Disons que vous avez une application qui a un champ booléen dans sa table User appelée Inactive.

Y a-t-il quelque chose d'intrinsèquement mauvais à simplement stocker false comme nul? Dans l'affirmative, pouvez-vous expliquer ce que devrait être l'inconvénient? 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.

21
Ominus

Y a-t-il quelque chose d'intrinsèquement mauvais à simplement stocker false comme nul?

Oui.

Dans l'affirmative, pouvez-vous expliquer ce que devrait être l'inconvénient?

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 faux).

True and NULL or False est NULL (pas faux).

http://en.wikipedia.org/wiki/Null_ (SQL) # Three-value_logic_.283VL.29

http://technet.Microsoft.com/en-us/library/cc966426.aspx

51
S.Lott

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 "null" 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é.

15
Jacob Maristany

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.

5
Lord Tydus