Le problème est qu'en faisant ainsi tu créés des exceptions que tu dois gérer de manière particulière et qui sont naturellement résolues par l'emploi du NULL.
Pour reprendre tes exemples, en fonction des moteurs de bases de données, affecter 0 dans une date ne stockera pas les mêmes valeurs.
DB2, par exemple, le supporte ('0000-00-00') alors que SQL Server remplace par '1900-01-01'.
Au final, pour analyser tes données par la suite, en fonction du moteur, tu es donc obligé de t'adapter. Garder un NULL éviterait ce problème.
Stocker du -1 dans une colonne de type Age est plutôt malvenu car tu perds la possibilité de n'y mettre que des valeurs non signées. A la limite, tu peux mettre 0 mais ça ne règle pas l'autre partie du problème : tu dois te rappeler d'exclure ces valeurs pour travailler avec la colonne associée.
Donc, lors des requêtes, en transformant le test sur la valeur NULL par un test sur -1, tu remplaces l'exception naturelle "NULL" par une règle applicative liée au "-1".
A supposer que tu recherches tous les élèves mineurs, "age < 18 " suffira amplement si tu utilises les NULL. Dans l'autre cas, tu dois rajouter " AND age <> -1" et si tu oublies ce petit morceau, ta liste sera fausse.
Maintenant, chacun fait comme il l'entend mais d'expérience, dans l'énorme majorité des bases de données mes collègues Oracle / DB2 et moi même gérons, le NULL existe et a son utilité.
Edit :
Oups, cross post avec Sephi-Chan
Re-edit :
SELECT SUM(age) FROM users;
Suffira amplement car les valeur NULL seront naturellement exclues
Pour reprendre tes exemples, en fonction des moteurs de bases de données, affecter 0 dans une date ne stockera pas les mêmes valeurs.
DB2, par exemple, le supporte ('0000-00-00') alors que SQL Server remplace par '1900-01-01'.
Au final, pour analyser tes données par la suite, en fonction du moteur, tu es donc obligé de t'adapter. Garder un NULL éviterait ce problème.
Stocker du -1 dans une colonne de type Age est plutôt malvenu car tu perds la possibilité de n'y mettre que des valeurs non signées. A la limite, tu peux mettre 0 mais ça ne règle pas l'autre partie du problème : tu dois te rappeler d'exclure ces valeurs pour travailler avec la colonne associée.
Donc, lors des requêtes, en transformant le test sur la valeur NULL par un test sur -1, tu remplaces l'exception naturelle "NULL" par une règle applicative liée au "-1".
A supposer que tu recherches tous les élèves mineurs, "age < 18 " suffira amplement si tu utilises les NULL. Dans l'autre cas, tu dois rajouter " AND age <> -1" et si tu oublies ce petit morceau, ta liste sera fausse.
Maintenant, chacun fait comme il l'entend mais d'expérience, dans l'énorme majorité des bases de données mes collègues Oracle / DB2 et moi même gérons, le NULL existe et a son utilité.
Edit :
Oups, cross post avec Sephi-Chan
Re-edit :
SELECT SUM(age) FROM users;
Suffira amplement car les valeur NULL seront naturellement exclues
Quand on te dit qu'un projet est terminé à 90%, prépare toi pour les 90% suivant
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC
Ninety-Ninety Rule
"Une guerre de religions, c'est quand deux peuples s'entretuent pour savoir qui a le meilleur ami imaginaire"
Vu sur IRC