Question

Si vous avez par exemple> 5 gauche se joint à une requête est qu'un code odeur qu'il ya ...

  • quelque chose de mal avec votre conception?
  • que vous faites trop en une seule requête?
  • vous êtes base de données est trop normalisée?
Était-ce utile?

La solution

Il est une solution tout à fait légitime pour certains modèles.

Disons que vous avez une hiérarchie d'un à plusieurs relations comme Customer - Order - Basket - Item - Price, etc., qui peuvent être non pourvus tous les niveaux: un Customer peut ne pas avoir Orders, un Order ne peut pas avoir Baskets , etc.

Dans ce cas, vous émettez quelque chose comme:

SELECT  *
FROM    Customer c
LEFT OUTER JOIN
        Order o
ON      o.CustomerID = c.ID
LEFT OUTER JOIN
        Basket b
ON      b.OrderID = c.ID
…

Notez qu'il peut être inefficace dans certains cas, et peut être remplacé par EXISTS ou NOT EXISTS (si vous voulez seulement savoir que les enregistrements correspondants existent ou n'existent pas dans d'autres tableaux).

Voir cet article dans mon blog pour les détails de la performance:

Autres conseils

Dans le sens où il est quelque chose que vous pouvez / devez enquêter sur je dirais que oui. Il est probable que vous pouvez obtenir une meilleure utilité et la maintenance par affacturage des vues sur ce sujet.

Dans le sens où il est « mauvais code » non, cela pourrait facilement être raisonnable surtout pour les plus grandes et les bases de données DB modernes seront probablement optimiser toutes les inefficacités.

Non, il est parfaitement bien de le faire, mais si vous vous trouvez à écrire les mêmes requêtes / procédures en utilisant encore et encore le même joint aux mêmes tables, il peut-être un candidat à la création d'une vue juste pour vous simplifier les requêtes à l'avenir êtes des, et de réduire le nombre de points de contact que vous auriez besoin de changer si vous êtes des modifications de schéma

Beaucoup de fois vous pouvez atténuer l'odeur visuelle en créant des vues d'aide, je ne pense pas qu'il y ait une règle dure et rapide de combien de gauche jointures sont considérés comme mauvais.

Contrairement aux codes de procédure, décomposer SQL en petits morceaux peut entraîner des requêtes inefficaces.

Il est à peu près impossible pour quelqu'un de répondre à une question aussi générale que cela et d'essayer de créer une telle règle arbitraire serait inutile.

gauche jointures sont un type de jointure parfaitement acceptable sur la carte à un besoin commun: Retrouve moi tous les x de, si elles ont associé les y obtiennent alors ceux qui sont trop

.

Vos #Mon Variez

Tout ce qui sort de l'ordinaire pourrait être un code-odeur pour quoi que ce soit. Comme Quassnoi dit qu'il pourrait être tout à fait légitime. Il est pas rare pour vraiment en profondeur les rapports d'exiger une quantité folle de joint à rassembler correctement les informations. Cela ne signifie pas que le promoteur devrait regarder dénormaliser leur base de données.

Non, pas du tout. Il est tout à fait légitime de construire une conception de base de données qui utilise un nombre important de gauche rejoint sur certaines requêtes.

Après avoir dit que je préférerais généralement construire la base de données de telle sorte que le nombre de cas où les jointures externes sont obligatoires est limitée que l'expérience tend à suggérer que (complexes) les requêtes qui les utilisent sont plus d'erreurs et susceptibles de donner lieu à les problèmes d'entretien.

En aparté historique intéressant, les premières versions de DB2 d'IBM, quand il a couru sur les ordinateurs centraux seulement, ne prend pas en charge les jointures externes (Oracle et Ingress ont tous deux fait à l'époque qui était un argument de vente majeur). Cela a conduit à des problèmes intéressants dans la conception de base de données comme il était nécessaire de veiller à ce que toutes les exigences d'accès aux données attendues pour la base de données pourraient être résolus en utilisant seulement des jointures internes.

Je soutiens que d'avoir à utiliser un grand nombre des jointures (par exemple traiter des données normalisées) n'est pas une odeur de code, mais plutôt une indication que vous pourriez ne pas travailler au bon endroit. Dans mon expérience, ceux qui sont préoccupés par le nombre de jointures dans les requêtes se développent trop dans la base de données et pas assez dans les applications et les rapports qui exposent les données. Les structures de données doivent être suffisamment souples pour supporter une myriade d'utilisations, ce qui est pourquoi la normalisation, à un degré ou un autre, il est important.

Dans la construction d'applications d'entreprise d'aujourd'hui, les développeurs peuvent tirer parti des réalisations d'hier à travailler à des niveaux abstraits hautes technologies ci-dessus comme SQL, XML et même, afin d'offrir plus de valeur avec moins de travail. Il existe des outils, à savoir rapport écrivains, générateurs de code, ORM, cadres d'entités, etc., que abstraire le travail à faible niveau de construction SQL manuellement, et effectuera les jointures pour vous. La plupart sont conscients du dialecte SQL utilisé (par exemple, Oracle 9 vs MySQL 3) et peut générer la syntaxe SQL qui est le plus efficace pour ce dialecte; ce qui signifie qu'ils peuvent probablement créer les jointures mieux que vous pouvez.

Cependant, ces outils fonctionnent très mal, ou pas du tout, dans un environnement relationnel sans normalisation suffisante. Pour moi, c'est là une odeur de « développement » se manifeste; si un outil d'accès aux données établies ne peuvent comprendre les relations dans lesquelles j'ai structuré mes données, je dois probablement chercher une façon plus normalisée pour créer ces relations et de récolter les avantages qui y dépassent de loin seulement l'utilisation de l'outil. En règle générale, quelque part entre 2 et 3 forme normale est la tache douce; bien que toujours il a tendance à être de petites zones de données relationnelles où un degré de normalisation est logique et apporte une valeur ajoutée plus élevée.

Cordialement, Travis

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top