2009-11-13 3 views
4

Quelle est meilleure requête supplémentaire ou colonne supplémentaire dans la base de données pour les données qui seront disponibles très moins de temps. Exemple: En cas de gestion des sous-utilisateurs, j'ajoute une colonne supplémentaire super_user_id dans la table des utilisateurs principaux et je recrute si les types d'utilisateurs sont sub_user et la valeur par défaut est -1 ou je crée une nouvelle table table.Quelle est meilleure requête supplémentaire ou colonne supplémentaire dans la base de données?

Mais en cas de connexion je dois chercher dans deux tables et cela je dois faire une autre requête.

Merci

+2

requête supplémentaire vs colonne supplémentaire, que voulez-vous dire? Pouvez-vous clarifier? – RageZ

+1

Le PO demande de dénormaliser quelque peu sa base de données, en ajoutant des informations redondantes en tant que colonne distincte * pouvant * être dérivée en effectuant une jointure ou une requête supplémentaire. La dénormalisation est une approche courante pour améliorer les performances des requêtes de base de données, mais au prix d'un travail supplémentaire pour préserver l'intégrité des données lorsque/si les données sous-jacentes utilisées pour créer la colonne supplémentaire sont modifiées. – PaulMcG

Répondre

1

Il n'y a pas de réponse générale; vous devrez être plus précis. Tout ce que je peux fournir sont des principes généraux. Toutes choses égales par ailleurs, vous serez mieux avec une base de données bien normalisée sans informations redondantes, pour un certain nombre de raisons. Mais il existe des situations où des informations redondantes pourraient sauver votre programme beaucoup de temps. Un exemple est un texte formaté avec Markdown: vous devez stocker le balisage d'origine pour permettre l'édition, mais le formatage de la source chaque fois que vous avez besoin de la sortie peut être extrêmement lourd sur le système. Par conséquent, vous pouvez ajouter une colonne redondante pour stocker la sortie formatée et assumer la responsabilité supplémentaire de veiller à ce que cette colonne soit mise à jour. Tout ce que je sais de votre situation, c'est que la colonne supplémentaire postulée enregistrerait une requête. La seule bonne réponse à cela est que vous devriez probablement garder votre table propre et minimale à moins que vous sachiez que les avantages de la sauvegarde d'une requête en termes de performances compenseront cela. Rappelez-vous, l'optimisation prématurée est la racine de tous les maux - vous pouvez trouver que votre application fonctionne plus que suffisamment vite de toute façon. Si vous trouvez lors du profilage que la requête supplémentaire est un goulot d'étranglement significatif, vous pouvez envisager d'ajouter la colonne. Encore une fois, sans plus de connaissance de votre situation, il est impossible de faire une recommandation précise ou concrète, mais j'espère vous avoir au moins aidé à prendre une décision.

+0

Thom a raison. Vous avez juste à pondérer l'impact d'avoir par exemple. données redondantes avec la façon dont il sera plus loin sur la route. Par expérience personnelle, je suis passé d'environ 10 tables à environ 6, en ayant quelques données redondantes. Et cela m'a aussi sauvé beaucoup de codage supplémentaire pour obtenir des informations à partir de différentes tables et ainsi de suite. – Steven

0

Voulez-vous dire calculer une valeur dans la requête contre le stockage d'une valeur calculée?

Cela dépend de la fréquence à laquelle il sera mis à jour, de la taille des données et de leur fréquence d'utilisation. Il n'y a peut-être pas de meilleure réponse théorique, vous devrez tester et profiler.

-1

L'exécution d'une requête supplémentaire prendra toujours plus de temps. L'ajout d'une colonne supplémentaire dans la base de données n'aura aucun impact significatif, même si vous devez avoir des milliers de lignes.

Ergo, ajoutez colonne supplémentaire et économisez DB :) trafic

+2

"L'ajout d'une colonne supplémentaire dans la base de données n'aura aucun impact significatif" - pouvez-vous soutenir cette affirmation avec une sorte de preuve? –

+0

Le calcul * pourrait * être effectué plus efficacement dans la partie frontale. – cjk

+0

@Dominic: Ce qui prendra le plus de temps. Faire une requête ou deux requêtes? Et à moins qu'il ne stocke une énorme quantité de données dans cette colonne supplémentaire, il ne prendra pas de ressources/espace significatif de la base de données. En théorie, faire deux requêtes prend plus d'un. En pratique, nous ne remarquerions probablement pas puisque nous parlons ms et non minutes. – Steven

0

Cela dépend de la quantité de redondance que vous ajouterez à la table en ajoutant une colonne. Avec une bonne indexation et une bonne conception, les joints fonctionnent mieux, donc pas besoin de craindre une normalisation si nécessaire.

0

Utilisez le second tableau. Il faudra pas vous obliger à émettre deux requêtes.Au lieu de cela, vous émettrez une seule requête réunissant les deux tables ensemble ou, mieux encore, créer une vue qui ne l'REJOIGNEZ pour vous:

SELECT usertable.col1, usertable.col2 superusertable.superuserid 
    FROM usertable LEFT OUTER JOIN superusertable 
    ON usertable.userid = superusertable.userid 

Cela vous permet de maintenir la structure normalisée appropriée, aide vous dans certains requêtes (comme déterminer qui est super_user), et permet à la base de données d'optimiser les problèmes de recherche.

+0

Mais en cas d'insertion je dois vérifier dans les deux tables soit ce nom d'utilisateur existe ou pas. –

+0

1) C'est une question différente de celle posée à l'origine, qui concernait l'interrogation et 2) Non, si l'utilisateur n'est pas dans la table des utilisateurs, il ne peut pas avoir d'enregistrement dans l'autre table. Vous pouvez le garantir en déclarant les relations clés appropriées dans la conception de la base de données. –

Questions connexes