Comment puis-je éviter toute redondance des champs de données dans le jeu de résultats lors de l'utilisation de Jointures?
De jointure suivante est censé récupérer les infos de l'utilisateur ainsi que leurs messages pour les utilisateurs avec un certain statut:
SELECT * FROM user, message WHERE message.user_id=user.id AND user.status=1
Le problème est que toutes les lignes d'un joueur dans le jeu de résultats contient redondant colonnes que répéter les mêmes données sur l'utilisateur (ces champs extraits de l'utilisateur table), uniquement les champs de la table de messages contiennent des informations redondantes. Quelque chose comme ceci:
user.id username email message.id subject
1 jane jane@gmail.com 120 Notification
1 jane jane@gmail.com 122 Re:Hello
1 jane jane@gmail.com 125 Quotation
2 john john@yahoo.com 127 Hi jane
2 john john@yahoo.com 128 Fix thiss
2 john john@yahoo.com 129 Ok
3 jim jim@msn.com 140 Re:Re:Quotation
Comme vous pouvez le voir beaucoup de données sont redondantes et nous ne voulons pas d'abord trouver les utilisateurs et ensuite aller sur leurs messages en boucle comme des structures ou quelque chose comme ça. Les boucles qui provoquent des micro-requêtes doivent être évités à tout prix.
Je ne m'inquiète pas à propos de la sortie de mon programme, qui est très bien géré dans l'INTERFACE utilisateur. Je pense peut-être le trafic réseau produit en retournant le résultat de cette requête pourrait être sensiblement réduit si d'une certaine façon je peux réussir à éliminer la répétition des données de l'utilisateur dans toutes les lignes relatives à cet utilisateur.
Pardonnez-moi, mais c'est la façon dont les bases de données de travail. Chaque message est différent, de sorte que votre INTÉRIEUR se JOINDRE à l'opération va concerner chaque message à l'utilisateur qui l'a écrit. Les données ne sont pas physiquement redondant, vous êtes seulement de voir le résultat de la JOINTURE INTERNE. Vous devez retourner le résultat tel qu'il est et ensuite de voir comment vous souhaitez afficher partout où vous l'utilisez (UI, rapport, etc.).
Qu'est-ce que votre middleware de base de données access? Plutôt que d'un seul jeu d'enregistrements' de lignes et de colonnes, il peut prendre en charge ğ relationnel ğ jeux de résultats (les jeux de données avec des relations dans ADO.NET) ou hiérarchique, des jeux de résultats (jeu d'enregistrements hiérarchique dans ADO classique).
C'est en effet une bonne façon d'aller. À l'aide de jeux de données, ou (N)Hibernate, iBATIS ou(.NET) ferait tous du groupement et hiérarchique résultat de la création pour vous.
OriginalL'auteur | 2010-07-05
Vous devez vous connecter pour publier un commentaire.
Il y a plusieurs choses que vous devez savoir.
La première est que la valeur par défaut de SQL REJOINDRE construire est essentiellement un ensemble de croix de produit, limitée par la clause where. Cela signifie qu'il est multiplicative - vous obtenir un double des résultats qui vous puis la tailler en bas. Vous devez également être prudent en présence de champs NULL.
La deuxième est qu'il existe un 'DISTINCT' mot-clé. Lorsque vous préfixe d'une colonne dans la sélection avec cela, vous aurez tout au plus une instance d'une certaine valeur pour cette colonne dans les résultats. Donc, selon votre requête 'SELECT DISTINCT de l'utilisateur.id DE " permettra d'éliminer les redondances sur le côté serveur.
La troisième est que la bonne façon de résoudre ce problème est susceptible de ne pas utiliser la
*
de l'opérateur. Je suggère:Il utilise le simple, facile à comprendre implicite-de la syntaxe de jointure et doit être valide SQL sur n'importe quel serveur. Je peux témoigner pour qu'il fonctionne avec MySQL, au moins. Il a également alias le "message" table " m " comme abréviation.
Comme vous l'avez déduit, cela permettra de réduire le trafic à partir du serveur SQL de votre base de données.
edit: si vous voulez éliminer le "redondant" d'information par courrier électronique, vous ne pouvez pas - vous devez faire deux requêtes distinctes. Les résultats SQL tables et doit être de forme rectangulaire, avec toutes les valeurs connues rempli. Il n'y a pas de 'idem' entrée.
edit 2: Vous n'avez qu'à faire deux requêtes. Par exemple:
C'est une requête qui contient une requête imbriquée, donc c'est vraiment faire de la base de données deux coups. Mais il n'a pas de programmatiques boucles.
OriginalL'auteur Borealid
Dans la requête sql, il n'est pas si vous les garder comme une seule requête. Si vous êtes par programmation de l'impression cela, alors vous serait de l'ordre par l'utilisateur et uniquement réimprimer ces informations si l'utilisateur changements d'identité.
OriginalL'auteur REW
Dans le standard SQL, vous pouvez utiliser JOINTURE NATURELLE; cela rejoint sur la commune de noms de colonne et permet uniquement de conserver une copie de ces noms communs.
Dans la pratique, attentivement la liste de colonnes que vous voulez, plutôt que de recourir aux '*' notation abrégée.
OriginalL'auteur Jonathan Leffler
En supposant que vous pouvez utiliser la procédure stockée, vous pouvez écrire un pour exécuter la requête ci-dessus et ensuite utiliser un curseur pour stocker les valeurs null pour les "informations redondantes" pour obtenir quelque chose comme
et ensuite de retour à ce jeu de résultats dans une table temporaire. mais tout cela peut réduire le trafic réseau, il va ajouter une surcharge de traitement
Une autre façon est de faire fonctionner 2 requêtes, l'une pour obtenir les informations de l'utilisateur, et de l'autre pour obtenir les informations du message avec seulement liés id d'utilisateur, puis faire "adhérer" à l'aide de l'application côté serveur code. quelque chose comme
et
qui donnera 2 voyages à la base de données, au lieu de 1, ce qui pourrait éventuellement être plus lent, même si le trafic réseau est réduite.
Et l'autre bouquet ces 2 dans un seul jeu de résultats avec quelque chose comme
pour obtenir quelque chose comme
et ensuite utiliser l'application serveur logique de séparer. réduit le trafic réseau, mais plus de l'application de la charge du serveur /un peu plus de la base de données de la charge du serveur.
Mais l'sauvé le trafic réseau est rarement la peine de la complexité ajoutée.
OriginalL'auteur potatopeelings