Quel est le plus efficace: plusieurs tables MySQL ou une grande table?

Je stocke divers détails d’utilisateur dans ma firebase database MySQL. À l’origine, il était configuré dans différentes tables, ce qui signifie que les données sont liées aux UserIds et qu’elles sont transmises via des appels parfois compliqués pour afficher et manipuler les données selon les besoins. Mettre en place un nouveau système, il est presque logique de combiner toutes ces tables dans une grande table de contenu connexe.

  • Est-ce que cela va être une aide ou un obstacle?
  • Des considérations de rapidité dans l’appel, la mise à jour ou la recherche / manipulation?

Voici un exemple de certaines de mes structures de table:

  • utilisateurs – UserId, nom d’utilisateur, email, mot de passe crypté, date d’inscription, ip
  • user_details – données de cookie, nom, adresse, coordonnées, affiliation, données démographiques
  • user_activity – consortingbutions, dernière connexion, dernière consultation
  • user_settings – parameters d’affichage du profil
  • user_interests – variables ciblables publicitaires
  • user_levels – droits d’access
  • user_stats – hits, comstack

Edit: J’ai relevé toutes les réponses jusqu’à présent, elles contiennent toutes des éléments qui répondent essentiellement à ma question.

La plupart des tableaux ont une relation 1: 1 qui était la raison principale pour les dénormaliser.

Y aura-t-il des problèmes si la table couvre plus de 100 colonnes lorsqu’une grande partie de ces cellules est susceptible de restr vide?

Plusieurs tables aident dans les cas suivants:

(a) si différentes personnes développent des applications impliquant des tables différentes, il est logique de les séparer.

(b) Si vous voulez donner différents types d’autorités à différentes personnes pour différentes parties de la collecte de données, il peut être plus pratique de les séparer. (Bien sûr, vous pouvez définir les vues et les autoriser de manière appropriée).

(c) Pour déplacer des données à différents endroits, en particulier pendant le développement, il peut être judicieux d’utiliser des tableaux pour réduire la taille des fichiers.

(d) Une empreinte plus petite peut vous apporter du confort lorsque vous développez des applications sur des collectes de données spécifiques d’une seule entité.

(e) C’est une possibilité: ce que vous pensiez comme une valeur unique peut s’avérer être de multiples valeurs à l’avenir. Par exemple, la limite de crédit est un champ de valeur unique à partir de maintenant. Mais demain, vous pouvez décider de modifier les valeurs au (date, date, valeur du crédit). Les tables divisées peuvent être utiles maintenant.

Mon vote serait pour plusieurs tables – avec des données correctement réparties.

Bonne chance.

La combinaison des tables est appelée dénormalisation.

Cela peut aider (ou ne pas aider) à exécuter plus rapidement certaines requêtes (qui font beaucoup de JOIN ) au désortingment de la création d’un environnement de maintenance.

MySQL est capable d’utiliser uniquement la méthode JOIN , à savoir NESTED LOOPS .

Cela signifie que pour chaque enregistrement de la table de conduite, MySQL localise un enregistrement correspondant dans la table pilotée dans une boucle.

Localiser un enregistrement est une opération assez coûteuse, qui peut prendre des dizaines de fois plus longtemps que l’parsing pure des enregistrements.

Déplacer tous vos enregistrements dans une seule table vous aidera à vous débarrasser de cette opération, mais la table elle-même s’agrandit et l’parsing de la table prend plus de temps.

Si vous avez beaucoup d’enregistrements dans d’autres tables, alors l’augmentation de l’parsing de la table peut entraîner un surpoids sur les avantages des enregistrements analysés de manière séquentielle.

L’enfer de maintenance, par contre, est garanti.

Sont-ils tous des relations 1: 1? Je veux dire, si un utilisateur pouvait appartenir à différents niveaux d’utilisateurs, par exemple, ou si les intérêts des utilisateurs étaient représentés sous la forme de plusieurs enregistrements dans la table des intérêts, la fusion de ces tables serait immédiatement exclue.

En ce qui concerne les réponses précédentes concernant la normalisation, il faut dire que les règles de normalisation de la firebase database ont complètement ignoré les performances et ne se préoccupent que de la conception d’une firebase database soignée. C’est souvent ce que vous voulez réaliser, mais il y a des moments où il est logique de les dénormaliser activement en quête de performance.

Globalement, je dirais que la question se rapporte au nombre de champs dans les tableaux et à la fréquence de leur access. Si l’activité des utilisateurs n’est souvent pas très intéressante, il peut être gênant de la conserver sur le même disque pour des raisons de performances et de maintenance. Si certaines données, comme les parameters, par exemple, sont très souvent accessibles, mais contiennent simplement trop de champs, il ne sera peut-être pas pratique non plus de fusionner les tables. Si vous ne vous intéressez qu’au gain de performances, vous pouvez envisager d’autres approches, telles que la séparation des parameters, mais en les enregistrant dans une variable de session afin de ne pas avoir à interroger la firebase database très souvent.

Est-ce que toutes ces tables ont une relation de 1-to-1 ? Par exemple, chaque ligne d’utilisateur aura-t-elle une seule ligne correspondante dans user_stats ou user_levels ? Si c’est le cas, il pourrait être judicieux de les combiner en une seule table. Si la relation n’est pas de 1 to 1 , cela n’aurait probablement pas de sens de les combiner (dénormaliser).

Le fait de les avoir dans des tables séparées ou dans une table aura probablement peu d’effet sur les performances, sauf si vous avez des centaines de milliers ou des millions d’enregistrements d’utilisateurs. Le seul avantage que vous obtiendrez sera de simplifier vos requêtes en les combinant.

ETA:

Si votre préoccupation est d’avoir trop de colonnes , réfléchissez à ce que vous utilisez généralement ensemble et combinez-les , en laissant le rest dans une table séparée (ou plusieurs tables si nécessaire).

Si vous examinez la manière dont vous utilisez les données, vous constaterez que 80% de vos requêtes utilisent 20% de ces données, les 80% restants étant utilisés occasionnellement. Combinez ce qui est souvent utilisé 20% dans un seul tableau et laissez 80% que vous n’utilisez pas souvent dans des tableaux séparés et vous aurez probablement un bon compromis.

Pourquoi ne pas utiliser la même approche que WordPress en ayant une table d’utilisateurs avec des informations utilisateur de base que tout le monde possède, puis en ajoutant une table “user_meta” qui peut être n’importe quelle clé associée à l’ID utilisateur. Donc, si vous avez besoin de trouver toutes les méta-informations pour l’utilisateur, vous pouvez simplement les append à votre requête. Vous n’aurez pas toujours à append la requête supplémentaire si vous n’avez pas besoin de vous connecter. L’avantage de cette approche permet également à votre table d’append de nouvelles fonctionnalités à vos utilisateurs, par exemple stocker leur identifiant ou chaque intérêt. Vous n’aurez pas non plus à gérer un labyrinthe d’ID associés, car vous avez une table qui régit toutes les métadonnées et vous ne la limiterez qu’à une seule association au lieu de 50.

WordPress le fait spécifiquement pour permettre l’ajout de fonctionnalités via des plugins, permettant ainsi à votre projet d’être plus évolutif et ne nécessitant pas une refonte complète de la firebase database si vous devez append une nouvelle fonctionnalité.

La création d’une table massive va à l’encontre des principaux bases de données relationnelles. Je ne les combinerais pas dans une seule table. Votre va obtenir plusieurs instances de données répétées. Si votre utilisateur a trois intérêts par exemple, vous aurez 3 lignes, avec les mêmes données utilisateur, juste pour stocker les trois intérêts différents. Sans aucun doute, optez pour l’approche de table «normalisée» multiple. Voir cette page Wiki pour la normalisation de la firebase database.

Edit: J’ai mis à jour ma réponse, car vous avez mis à jour votre question … Je suis encore plus d’accord avec ma réponse initiale depuis …

une grande partie de ces cellules est susceptible de restr vide

Si, par exemple, un utilisateur n’avait aucun intérêt, si vous normalisez, vous n’auriez simplement pas de ligne dans la table des intérêts pour cet utilisateur. Si vous avez tout dans une table massive, vous aurez alors des colonnes (et apparemment beaucoup d’entre elles) contenant uniquement des NULL.

J’ai travaillé pour une entreprise de téléphonie où il y avait des tonnes de tables, l’obtention de données pouvait nécessiter de nombreuses jointures. Lorsque les performances de lecture de ces tables étaient critiques, les procédures créées qui pouvaient générer une table plate (c’est-à-dire une table dénormalisée) ne nécessitant aucune jointure, aucun calcul, etc. Celles-ci ont alors été utilisées conjointement avec un agent serveur SQL pour exécuter le travail à certains intervalles (par exemple, une vue hebdomadaire de certaines statistiques était exécutée une fois par semaine, etc.).

Je pense que c’est l’une de ces situations “ça dépend”. Avoir plusieurs tables est plus propre et probablement théoriquement mieux. Mais lorsque vous devez vous connecter à 6 ou 7 tables pour obtenir des informations sur un seul utilisateur, vous pouvez commencer à repenser cette approche.

Je dirais que cela dépend de ce que les autres tableaux veulent vraiment dire. Est-ce qu’un user_details contient plus de 1 utilisateur / utilisateur, etc. Le niveau de normalisation le mieux adapté à vos besoins dépend de vos exigences.

Si vous avez une table avec un bon index, ce serait probablement plus rapide. Mais d’autre part, probablement plus difficile à maintenir.

Pour moi, il semble que vous puissiez ignorer User_Details, car il est probablement lié 1 à 1 aux utilisateurs. Mais le rest est probablement beaucoup de lignes par utilisateur?