|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Très intéressant.
Merci, encore une fois, fsmrel de nous bercer de philosophie et d'humour au milieu des discussions techniques. |
|
|
00
|
|
|
#22 | |
|
Expert Confirmé
![]() ![]() |
Citation:
En effet quand on traite un NULL on traite bel et bien une valeur sans la connaitre. C'est d'ailleurs aussi pour cela que la norme SQL impose de retourner chaque NULL, lors d'un distinct par exemple. En effet ces NULL représente une valeur que l'on ne connait pas, elle n'est donc pas évaluable et sans évaluation on se contente de retourner l'information directement. Suivant donc cette logique je ne suis pas contre les NULL, bien au contraire je pense que c'est idéal pour désigner une information non connue, chose qui arrive tous les jours. Bien sûr cette théorie n'est pas suivi par tous les SGBD, et puis je peut me tromper ce n'est que ma manière de voir.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
|
00
|
|
|
#23 |
|
Membre Expert
![]() Inscription : mars 2005 Messages : 1 682 ![]() |
Ce que fsmrel veut dire c'est qu'on peut modéliser de manière à ne pas avoir de colonnes NULLables. Là ou le marqueur NULL désigne l'absence de valeur, la non présence d'un enregistrement la désigne aussi bien.
Ainsi en prenant l'exemple absurde suivant : Entite1 = {Id_Entite} ValeurAttributEntite1 = {#Id_Entite, Valeur} Modélise bien un attribut de l'Entité1 nullable sans colonne nullable dans la table. Bon évidemment quand on fait une jointure externe, on retrouve le NULL en cas de non présence de la donnée .
|
|
|
00
|
|
|
#24 |
|
Expert Confirmé
![]() ![]() |
Oui j'en conviens, ma réponse voulais simplement exprimer que les champs nullables n'était pas pour moi une chose de mal, même voir utile.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
00
|
|
|
#25 | ||||||
|
Membre confirmé
![]() Inscription : mai 2004 Messages : 240 ![]() |
Encore beaucoup de choses intéressantes écrites dans les derniers messages, et trop peu de temps pour les étudier comme elles le mériteraient !
En quelques mots : Citation:
Au fait, est-elle largement implémentée dans le petit monde des SGBD ? Remarque : une chose que j'ai omis de préciser lors de nos précédentes discussions : j'ai pris l'habitude de tutoyer sur le forum, mais si tu préfères que je te vouvoie, n'hésite pas à me le faire savoir, ça ne me dérangerait aucunement. Citation:
Citation:
Pour s'en convaincre, on pourra exécuter les deux requêtes suivantes : Code :
Citation:
Et comme vous tous, j'essaie bien sûr d'alimenter moi-même la discussion avec ce que j'ai expérimenté ces derniers jours, que ce soit sur Access ou sur SQL Server. Je vous souhaite à tous un excellent week-end ! |
||||||
|
|
00
|
|
|
#26 |
|
Expert Confirmé
![]() ![]() |
Tout à fait d'accord avec toi J1, et tu a raison de dire qu'un distinct sur des NULL donne un seul NULL dans la plupart des SGBD, mais ça ne veux pas dire que c'est forcément sémantiquement juste.
D'ailleurs dans ta citation, ils parlent de valeurs, hors un NULL n'est pas une valeur, et c'est même totalement le contraire puisqu'il désigne l'absence même de valeur. Plus d'informations sur le NULL ici Après tout ceci n'est qu'un point de vue et la théorie est très différente (ici en est la preuve).
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1 Project Lead eXo Social Java Black Belt - Java Black Belt Coach |
|
00
|
|
|
#27 | ||||||
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 709 ![]() |
Bonjour,
Citation:
Si donc on admet qu’une requête (Query) est déclarative, la clause WITH est du genre déclaratif. N.B. En réponse à votre remarque, sur le forum, j'ai pris l'habitude du "vous". Citation:
Styles utilisés pour effectuer une jointure récursive (requêtes non testées) : Soit la table I (Composant, Composé)Pour obtenir les composants du composé "xyz" : Selon la norme SQL (à faire valider par SQLpro) : Code :
Code :
Hors SQL, en relationnel pur (avec le langage Tutorial D) : Code :
TCLOSE (I {Composé, Composant}) WHERE Composé = "xyz") {Composant}
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
||||||
|
|
00
|
|
|
#28 | ||
|
Membre confirmé
![]() Inscription : mai 2004 Messages : 240 ![]() |
Intéressant !
J'en ai profité pour parcourir le tutoriel de SQLPro, également très instructif. Malheureusement, je ne pense pas que les SGBD que j'utilise actuellement implémentent WITH (surtout s'il est apparu avec la norme SQL:1999). Mais ça reste bon à savoir, merci ! Citation:
Citation:
|
||
|
|
00
|
|
|
#29 | |||||||||||
|
Expert Confirmé Sénior
![]() ![]() ![]() François de Sainte MarieSpécialiste en bases de données Inscription : septembre 2006 Messages : 3 709 ![]() |
Citation:
En préambule, NULL est pour moi le nom d’un petit personnage magique, unique mais multiforme (ou polymorphe, terme à la mode), très difficile à maîtriser, façon savonnette. Il n’est pas une valeur, il n’a pas de valeur, mais il se fait volontiers passer pour une valeur (exemple : Insert Into T Values (..., NULL, ...)). Ainsi, les auteurs de la norme SQL se sont fait piéger, en écrivant que la valeur de vérité UNKNOWN (Cf. le type BOOLEAN) et NULL sont la même chose. Si l’on n’y prend garde, NULL s'empresse de polluer les bases de données, les parasiter, les ravager à la manière des criquets. NULL est un malin, il va jusqu’à chercher à faire faire des erreurs aux optimiseurs (je reviendrai sur ce point). Par exemple, quand JPhi33 explique à Chtouk qu’une modélisation approximative au niveau conceptuel peut avoir des conséquences funestes au niveau logique relationnel, il attire l’attention de notre jeune camarade sur l’irruption de NULL dans le résultat des requêtes et le met donc en garde. Ainsi, quand Chtouk met en scène des universitaires dont certains seulement sont des étudiants, JPhi33 lui explique la technique de la spécialisation, laquelle est particulièrement satisfaisante d’un point de vue sémantique, et conduit en plus au niveau logique à avoir deux tables tout à fait saines : Une table UNIVERSITAIRE contenant les attributs communs à tous les universitaires, ainsi qu’une table ETUDIANT contenant les attributs ne caractérisant que les étudiants. Un de ces attributs spécifiques a pour nom EstBoursier et permet de savoir si un étudiant est boursier, oui ou non. Avec ce système, au niveau tabulaire on peut coder "NOT NULL" pour chaque attribut, ce qui est un but à atteindre. Maintenant, que se passe-t-il si on décide de n’avoir qu’une seule table, à savoir la table UNIVERSITAIRE ? En toute logique, on autorisera NULL à se manifester. Je reprends le contenu de la table UNIVERSITAIRE, quand celle-ci a phagocyté la table ETUDIANT : Code :
Code :
Pour lever le genre d’ambiguïté que je viens d’évoquer, Ted Codd avait mis en œuvre une logique quadrivaluée, selon laquelle les valeurs de vérité ne sont plus seulement TRUE, FALSE et UNKNOWN, mais TRUE, FALSE, APPLICABLE et INAPPLICABLE. Selon cette logique, lorsque vous dites "quand on traite un NULL on traite bel et bien une valeur sans la connaître", vous signifiez que NULL se déguise en APPLICABLE, ce qui dans l’exemple de Chtouk correspond à la situation "On se sait pas si MOREAU est boursier", tandis que dans le cas de DUBOIS, MARTIN, NULL se déguise clairement en INAPPLICABLE. Pour la petite histoire, la logique quadrivaluée de Codd est "inapplicable" (sic), car, entre autres, des lois fondamentales telles que les lois de De Morgan sont mises en échec : ¬(p ET q)et ¬p OU ¬qne sont plus des formules équivalentes : si p et q prennent respectivement les valeurs de vérité APPLICABLE et INAPPLICABLE, la 1re expression sera évaluée à INAPPLICABLE tandis que la 2e sera évaluée à APPLICABLE. De la même façon, l’équivalence suivante ne vaut plus : ∀x (p) ≡ ¬∃x (¬p)Ou si vous préférez, "Tous les hommes sont mortels" n’est plus équivalent à "Il n’existe pas d’homme non mortel". NULL et les optimiseurs : Les optimiseurs sont généralement friands de ce que l’on appelle la fermeture transitive, ne serait-ce que pour rendre les requêtes plus performantes (c’est une de leurs missions...) Considérez la séquence suivante : Code :
Code :
Code :
Accessoirement, je rappelle ce qu’a écrit Codd concernant l’ensemble vide [The Relational Model for Database Management: Version 2 (Reading, Mass.: Addison-Wesley, 1990), page 188] : "SQL fournit NULL comme résultat de certaines fonctions statistiques (telles qu’AVERAGE) appliquées à l’ensemble vide. Puisque le NULL de SQL a été introduit pour signifier le fait qu’une valeur (db-value) est inconnue, ça n’est pas un choix judicieux de signifier dans ce contexte quelque chose de complètement différent, à savoir qu’un résultat arithmétique est indéfini."En l’occurrence, NULL se manifeste à nouveau, déguisé encore autrement (combien a-t-il de costumes ce Frégoli des bases de données ?)
__________________
_ Faites simple, mais pas plus simple ! (A. Einstein) E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire ») => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale ») __________________ Bases de données relationnelles et normalisation : de la première à la sixième forme normale (Bonne lecture !) |
|||||||||||
|
|
00
|
|
|
#30 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 163 ![]() |
Sur le WITH et le récursivité :
SQL Server, IBM DB2, Sybase et Firebird le gère, soit plus de 67% des parts de marché. Oracle gère cela de manière spécifique (une grosse connerie entre nous) uniquement pour les arbres (les parcours de graphe ne sont pas gérés). MySQL et PostGreSQL ne savent pas faire... Bref avec Oracle qui gère cela à moitié cela représente plus de 87 % de parts de marché ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
Copyright © 2000-2013 - www.developpez.com