Je lis sur la forme sténographique naturelle pour les jointures SQL et je vois des pièges: p>
6 Réponses :
Ces "pièges", qui semblent discuter contre des jointures naturelles, coupent les deux sens. Supposons que vous ajoutez une nouvelle colonne à Tableau A, en vous attendez à ce que cela soit utilisé pour être utilisé avec la table B. Si vous savez que chaque jointure de A et B est une jointure naturelle, alors vous avez terminé. Si chaque jointure utilise explicitement l'utilisation, vous devez les suivre tous et les changer. Manquez un et il y a un bug. P>
Utilisez des jointures naturelles lorsque la sémantique des tables suggère que c'est la bonne chose à faire. Utilisez des critères de jointure explicites lorsque vous souhaitez vous assurer que la jointure est effectuée de manière spécifique, quelle que soit la manière dont les définitions de la table pourraient évoluer. P>
Nul doute que naturel est plus "compliqué caché" que strict en utilisant ou général sur la clause (c'est une raison pour l'éviter), mais comme vous l'avez écrit dépend de la sémantique. Je suppose que dans la plupart des cas, je veux utiliser en utilisant ou sur, pour être sûr de cette manière spécifique.
Oui, je pense que dans la plupart des cas (mais pas tous), être explicite est meilleur.
Pour cette raison, je ne recommande pas la syntaxe dans aucun environnement. joint naturel code> Syntaxe est anti-motif: p>
Je ne recommande pas non plus la syntaxe de mélange (c.-à-d. Utilisation des deux Jointure naturelle Code> et Syntaxe Explicit Inner / Outer Rejoignez) - Conservez un format cohérent de la base de code. p>
+1 pour la requête est moins évidente. La lecture est bien plus difficile que d'écrire.
"Syntaxe va à l'encontre de la règle de modularité" - je pense que vous pouvez charger toute la langue SQL avec cela. Toutefois, si vous abordez ce défi d'utiliser SQL tout en adhérant aux principes relationnels aussi étroitement que possible, Jointure naturelle Code> brille positivement.
@eiledaywhen: toute la langue SQL? La question ne concerne pas les principes relationnels - il s'agit des considérations de code de niveau de production. Pour moi, cela signifie: la maintenance, la lisibilité, la cohérence, la performance. Il est assez évident que vous n'avez pas avoir une raison i> tant que * a créé un i> pour justifier la baisse.
J'ai bownvoted parce que vous avez suggéré que jointure naturelle code> est un "anti-modèle" sans prouver que c'est à ma satisfaction. Si vous utilisez SQL relativement, alors Join Natural Code> est probablement le seul dont vous avez besoin pour l'appeler un "anti-motif" sonne absurde pour moi.
@onedaywhen: Votre "satisfaction" ne reflète pas la question - l'OP n'a pas posé de questions sur le sens "relationnel" (franchement, je ne vois pas la valeur). "Motif" et "anti-motif" est une terminologie commune lors de la discussion sur la conception de logiciels, qui est ce que l'OP a posé sur i>. Parfois, vous avez un point - ce n'est pas une de ces occasions et il y a des réponses beaucoup moins correctes, mais elles n'ont pas été bullevées ...
JOIN NATUREL fait partie du algèbre relationnelle en parlant donc dans le "sens relationnel" est beaucoup sur le sujet. Je n'envisage pas d'utiliser un opérateur relationnel dans une langue supposément relativement être un "modèle de conception", sans parler d'un "anti-motif".
Je vois tout ton point. Ouais, j'ai écrit intentionnellement "dans l'environnement de production", alors je suis d'accord dans ce sens que nous pourrons envisager naturel comme anti-motif, car il est difficile à utiliser.
@Enedaywhen: "Anti-motif / modèle" a été utilisé pour décrire les énoncés de retour multiple Simple VS dans une méthode / une fonction, entre autres aspects de conception de programmation finement détaillés. Et maintenant, l'OP concédait qu'ils sont d'accord avec mon évaluation - vous comptez en paille.
Considérez que la langue véritablement relationnelle Tutoriel D < / a> n'a qu'un joindre être jointure naturelle code> ... Qu'est-ce que c'est ça? L'OP a concédé c'est un "anti-motif, parce que c'est difficile tu ust" ?! Tu as raison, je n'ai rien.
@onedaywhen: Est-ce une question de tutoriel d? La concession OPS renforce pourquoi ne pas utiliser la syntaxe (que mes points de balle se développent) - rien à voir avec vos "principes relationnels". Chaque réponse que vous faites confirme ma supposition originale. Quelle personne triste et en colère, vous devez être.
C'est une question sur les opérateurs relationnels, mais comme la plupart des gens que vous ne voyez pas les arbres pour le bois, pas de biggie. Triste / en colère ne pouvait pas être plus loin de la vérité, je vous assure;)
@onedaywhen: C'est hilarant en tenant compte de la portée définie de la question. J'ai oublié que "délirant" devrait être dans cette liste.
Épargnez-moi 10 secondes pour parcourir la section Contenu de l'article de Wikipedia sur algèbre relationnelle . Remarquez que certains key-clés SQL sautent sur vous (par exemple, rejoindre naturel)? En effet, SQL est basé sur l'algèbre relationnelle (certaines parties plus vaguement que d'autres). Votre œil peut même attraper que «la jointure naturelle est sans doute l'un des opérateurs les plus importants car c'est la contrepartie relationnelle de logique et». L'utilisation et la logique n'est ni un motif ni un anti-motif (loin de celui-ci) et la même chose s'applique à Jointure naturelle code> dans une langue supposée relationnelle.
De la FAQ: "Surtout, soyez honnête. Si vous voyez une désinformation, votez-la. Ajouter des commentaires indiquant quoi, en particulier, c'est faux." Ceci j'ai fait et je vais maintenant passer à autre chose. "Sois gentil" :)
@ONEDAYLORQuelle: Je prends des problèmes avec l'article de Wikipedia sur celui-ci, illustré par la Blunder sous Theta-Rejoindre Description "Prix = Prix" - qui montre comment traditionnellement algébra relationnelle ne pense pas beaucoup à plusieurs tables partageant un nom d'attribut, tout en étant distinct dans le sens. Vous pouvez toujours réécrire un jointure Natural code> avec un joint interne code>, mais il existe de nombreux cas lorsque vous ne pouvez pas implémenter un joint interne code> code> en utilisant un < Code> Jointure naturelle Code>. Cela rend Jointure naturelle Code> Un sucre syntaxique, au mieux. Cela fonctionne en maths, car en maths, vous supposez que le même nom toujours i> partage la même signification.
@ONDAYLORQuelle: J'ai toujours démontré que vous n'avez pas vraiment de raisons qui concernent la question encadrée de la raison pour laquelle vous devez indiquer que vous n'avez pas encore de problème avec une autre réponse. Personne d'autre n'est d'accord avec vous et de plus en plus impliquant de prendre problème avec votre position à ce sujet. Vous semblez détester des comptes de haute représentation, mais ne sont pas disposés à faire quoi que ce soit pour améliorer votre représentant - où est votre réponse? Les bowvotes peuvent être inversés, mais vous préférez être obtus - vous aimez mon attention. Vous êtes "en marche" car à un niveau, vous comprenez enfin votre comportement.
@OMG Poneys: (désolé pour le commentaire de bruit) bien dit. J'ai eu le même traitement d'Onedaywhen: toute critique, rien de constructif. Cela ressemble à un académique qui n'utilise pas réellement sql jour-jour, aime simplement lire des livres ...
Voulez-vous dire la syntaxe comme ceci: par rapport à ceci: p> i préférez la 2e syntaxe et aussi le formater différemment : P> SELECT *
FROM T1
LEFT OUTER JOIN T2 ON T2.id = T1.id
LEFT OUTER JOIN T3 ON T3.id = T2.id
Non - le premier exemple est la syntaxe ANSI-89, ce dernier est ANSI-92. Jointure naturelle Code> est également la syntaxe ANSI-92. Pardon, je pensais que le premier était Ansi-89, mais c'est un hybride des deux que je doute est soutenu sur tout ce que mysql.
Merci, mais mon doute concerne la nature naturelle (implicite «complète» de colonne correspondante). Je veux dire quelque chose comme Select * de T1 Natural Gauche Rejoignez T2;
Oh intéressant, je n'ai pas vu ce mot clé naturel avant. Désolé pour la réponse gaspillée, mais merci pour le nouveau mot clé.
Une chose qui détruit complètement Je vais coller à mon naturel code> pour moi est que la plupart de mes tables ont une colonne code> id code>, qui sont évidemment sémantiquement toutes différentes. Vous pouvez affirmer que d'avoir un user_id code> fait plus de sens que id code>, mais vous finissez par écrire des éléments tels que user.user_id code>, une violation du sec . Aussi, par la même logique, vous aurez également des colonnes comme user_first_name code>, user_last_name code>, user_age code> (qui a également du sens dans Voir que ce serait différent de, par exemple, session_age code>) ... l'horreur. P>
rejoindre ... sur ... Code>, Merci, Mruch. :) p>
Je suis d'accord avec les autres affiches selon lesquelles une jointure explicite devrait être utilisée pour des raisons de clarté et permettre également de permettre à un commutateur à une jointure "extérieure" si vos exigences changent. P>
Cependant, la plupart de vos "pièges" n'ont rien à voir avec des jointures, mais plutôt des maux d'utilisation "Select *" au lieu d'appeler explicitement nommer les colonnes que vous avez besoin "Select A.Col1, A.Col2, B.Col1, b. col2 ". Ces pièges se produisent chaque fois qu'une liste de colonnes génériques est utilisée. P>
Ajout d'une raison supplémentaire non inscrite dans aucune des réponses ci-dessus. Dans Postgres (pas sûr si cela est le cas pour d'autres bases de données) si aucun nom de colonne ne se trouve en commun entre les deux tables lors de l'utilisation de the Postgres Documentation a une note à cette Effet: p>
Remarque: L'utilisation est raisonnablement sûre des changements de colonne dans les relations jointes, car seules les colonnes répertoriées sont combinées. Natural est considérablement plus risquée puisque tout schéma change à l'une ou l'autre des relations qui provoquent un nouveau nom de colonne correspondant à présenter une jointure à associer cette nouvelle colonne également. P>
blockQuote> Natural Join code> ALORN A (code> jointure code> est effectué. Cela signifie que si vous avez eu une requête existante, puis vous deviez modifier ultérieurement l'un des noms de colonne dans une table, vous obtiendrez toujours un ensemble de lignes renvoyées de la requête plutôt qu'une erreur. Si vous avez eu lieu, vous avez utilisé le rejoindre ... en utilisant (...) code> Syntaxe, vous obtiendriez une erreur si la colonne de jonction n'était plus là. P>