152 votes

MySQL : plusieurs tables ou une seule table avec plusieurs colonnes ?

Il s'agit donc plutôt d'une question de conception.

J'ai une clé primaire (disons l'ID de l'utilisateur), et j'ai des tonnes d'informations associées à cet utilisateur.

Devrais-je avoir plusieurs tableaux répartis en catégories selon les informations, ou un seul tableau avec de nombreuses colonnes ?

La façon dont j'avais l'habitude de procéder était d'avoir plusieurs tables, par exemple une table pour les données d'utilisation de l'application, une table pour les informations sur le profil, une table pour les jetons du back-end, etc. pour que les choses restent organisées.

Récemment, quelqu'un m'a dit qu'il valait mieux ne pas procéder de cette façon et qu'il n'y avait pas de problème à avoir un tableau avec beaucoup de colonnes. Le problème est que toutes ces colonnes ont la même clé primaire.

Je suis assez novice en matière de conception de bases de données. Quelle est la meilleure approche et quels sont les avantages et les inconvénients ?

Quelle est la manière conventionnelle de procéder ?

0 votes

Pour plus de clarté, corrigez-moi si je me trompe, mais je pense que les "tableaux multiples" peuvent être compris comme des tableaux de liens/associatifs : fr.wikipedia.org/wiki/Associative_entity

1 votes

Cette base de données est-elle nécessaire à des fins d'analyse ou de traitement opérationnel/transactionnel ?

0 votes

Une approche conventionnelle de la conception des bases de données relationnelles est la modélisation de la relation entité-attribut. Le modèle normatif est le suivant : pour chaque "entité" du modèle (entité = une personne, un lieu, une chose, un concept ou un événement qui peut être identifié de manière unique et sur lequel nous devons stocker des informations), chaque "entité" est implémentée sous forme de table, avec une clé primaire/unique, chaque "attribut" à valeur unique est implémenté sous forme de colonne dans la table d'entité,

137voto

Brendan Long Points 24372

Chaque fois qu'une information est unique (chaque utilisateur a un nom et un mot de passe), il est probablement préférable d'avoir une seule table, car cela réduit le nombre de jointures que la base de données devra effectuer pour récupérer les résultats. Je pense que certaines bases de données ont une limite sur le nombre de colonnes par table, mais je ne m'en préoccuperais pas dans les cas normaux, et vous pouvez toujours les diviser plus tard si vous en avez besoin.

Si les données sont de type "one-to-many" (chaque utilisateur possède des milliers de lignes d'informations sur son utilisation), elles doivent être réparties dans des tables distinctes afin de réduire les données en double (les données en double gaspillent de l'espace de stockage, de l'espace de cache et rendent la base de données plus difficile à maintenir).

Vous pouvez trouver l'article de Wikipedia sur normalisation de la base de données intéressant, puisqu'il examine en profondeur les raisons de cette situation :

La normalisation des bases de données est le processus d'organisation des champs et des tables d'une base de données relationnelle afin de minimiser les redondances et les dépendances. La normalisation implique généralement la division de grandes tables en tables plus petites (et moins redondantes) et la définition de relations entre elles. L'objectif est d'isoler les données de sorte que les ajouts, les suppressions et les modifications d'un champ puissent être effectués dans une seule table et se propager ensuite dans le reste de la base de données via les relations définies.

Dénormalisation est également une chose dont il faut tenir compte, car il existe des cas où la répétition des données est préférable (car elle réduit la quantité de travail que la base de données doit effectuer lors de la lecture des données). Je vous recommande vivement de normaliser vos données autant que possible pour commencer, et de ne les dénormaliser que si vous avez conscience de problèmes de performances dans des requêtes spécifiques.

1 votes

Merci pour votre réponse. Après l'avoir lue, je pense que ce dont je parlais était la situation d'information univoque, lorsqu'un utilisateur dispose de plusieurs colonnes univoques.

0 votes

@Xavier_Ex - Oui, s'il n'y a qu'une seule colonne par utilisateur, alors une seule énorme table des utilisateurs sera plus facile à travailler (et beaucoup plus facile à optimiser pour le moteur de BD).

0 votes

Votre post modifié fournit des informations plus utiles ! J'ai une nouvelle préoccupation : si certaines colonnes sont fréquemment mises à jour, dois-je les placer dans des tables séparées ? Par exemple, la date de naissance d'un utilisateur ne sera jamais mise à jour, mais le jeton back-end peut être invalidé après un certain temps et nécessitera des mises à jour fréquentes. Serait-il préférable de séparer les tables de cette manière pour améliorer les performances ? Je vais maintenant aller lire sur le wiki que vous avez mentionné :)

15voto

HLGEM Points 54641

Une seule grande table est souvent un mauvais choix. Les tables connexes sont ce pour quoi les bases de données relationnelles ont été conçues. Si vous indexez correctement et que vous savez comment écrire des requêtes performantes, elles fonctionneront parfaitement.

Lorsque les tables comportent trop de colonnes, la taille réelle de la page sur laquelle la base de données stocke les informations peut poser problème. Soit l'enregistrement peut finir par être trop grand pour la page, auquel cas vous pouvez finir par ne pas être en mesure de créer ou de mettre à jour un enregistrement spécifique, ce qui rend les utilisateurs mécontents, soit vous pouvez (dans SQL Server au moins) être autorisé à un certain dépassement pour des types de données particuliers (avec un ensemble de règles que vous devez rechercher si vous faites cela), mais si beaucoup d'enregistrements dépassent la taille de la page, vous pouvez créer des problèmes de performance énormes. Maintenant, comment MYSQL gère les pages et si vous avez un problème lorsque la taille potentielle de la page devient trop grande, c'est quelque chose que vous devriez regarder dans la documentation de cette base de données.

1 votes

Ah des voix différentes ! Ce qui est toujours génial. Merci pour vos informations ! Je m'assurerai d'être conscient de cela lorsque je ferai mes tables... mais je ne savais pas que je devrais être conscient de choses de si bas niveau à l'origine.

4voto

Vlad Points 31

J'ai un bon exemple. Une base de données excessivement normalisée avec l'ensemble de relations suivant :

people -> rel_p2staff -> staff

et

people -> rel_p2prosp -> prospects

Où people a les noms et les détails des personnes, staff a juste les détails de l'enregistrement du staff, prospects a juste les détails des prospects, et les tables rel sont des tables de relation avec des clés étrangères de people liant au staff et aux prospects.

Ce type de conception s'applique à l'ensemble de la base de données.

Maintenant, pour interroger cet ensemble de relations, il faut à chaque fois faire une jointure multi-table, parfois 8 et plus. Cela a bien fonctionné jusqu'au milieu de cette année, quand cela a commencé à devenir très lent maintenant que nous avons dépassé 40000 enregistrements de personnes.

L'indexation et tous les fruits mûrs ont été épuisés l'année dernière, toutes les requêtes sont optimisées à la perfection. C'est la fin de la route pour la conception normalisée particulière et la direction a maintenant approuvé une reconstruction de toute l'application qui en dépend ainsi qu'une restructuration de la base de données, sur une période de 6 mois. $$$$ Ouch.

La solution sera d'avoir une relation directe pour people -> staff y people -> prospect

0 votes

Je serais intéressé de savoir comment la reconstruction s'est déroulée ? Avez-vous fini par concevoir quelque chose de similaire à l'héritage d'une seule table où vous aviez un fichier type être un staff ou un prospect ?

2 votes

J'ai opté pour la relation directe personnes -> personnel et personnes -> prospect, cela fonctionne à merveille, facile à utiliser, rapide à interroger.

3voto

Brian Points 1662

posez-vous ces questions si vous mettez tout dans un tableau, vous disposez de plusieurs lignes pour que l'utilisateur? Si vous devez mettre à jour un utilisateur voulez-vous conserver une piste de vérification? L'utilisateur peut-il avoir plus d'une instance d'un élément de données? (comme le numéro de téléphone par exemple) vous avez un cas où vous voudrez peut-être ajouter un élément ou ensemble d'éléments plus tard? si vous répondez oui, alors très probablement, vous voulez demander à l'enfant de tables avec des relations de clé étrangère.

Les Pros du parent/enfant tables est de l'intégrité des données, la performance via des index (oui, vous pouvez le faire sur une table à plat aussi) et de l'OMI plus facile à maintenir si vous avez besoin d'ajouter un champ plus tard, surtout si elle est un champ obligatoire.

Les inconvénients de la conception est plus difficile, les requêtes deviennent un peu plus complexes

Mais, il existe de nombreux cas où une grande table à plat seront appropriés, de sorte que vous avez à regarder votre situation de décider.

0 votes

Merci de me le rappeler ! Donc, dans mon cas, je ne considérais que le cas où chaque utilisateur ne peut pas avoir plus d'une ligne, donc tous les champs d'information sont un-à-un. De même, l'utilisateur ne peut pas avoir plus d'une instance du même élément, car je crois au concept selon lequel un élément ne peut pas exister à plus d'un endroit. Pour la troisième question, oui, je pourrais ajouter d'autres éléments à la table, mais ils n'enfreindront pas les exigences mentionnées ci-dessus. Je pense que le tableau parent/enfant est bon lorsque je veux associer plusieurs lignes à un utilisateur, mais dans ce cas, mon souci est qu'un utilisateur a de nombreuses colonnes un-à-un.

0 votes

Même si tous les éléments sont actuellement un à un, cela ne supprime pas la nécessité ou le désir d'avoir des tables parents/enfants IMO. Garder un journal des données modifiées est une utilisation. Le chargement paresseux d'objets en est une autre. Bien qu'il y ait des avantages à une structure de table unique, il y a aussi des avantages à des mises en page parent-enfant (bien que j'aie vu des gens aller à l'extrême avec celles-ci).

1voto

christopher Points 11

J'ai déjà fini de faire une sorte de conception de base de données. Pour moi, cela dépend de la difficulté du système avec la gestion de base de données ; oui, c'est vrai d'avoir des données uniques à un seul endroit, mais il est vraiment difficile de faire des requêtes avec une base de données trop normalisée avec beaucoup d'enregistrements. Combinez simplement les deux schémas ; utilisez une table énorme si vous pensez que vous aurez des enregistrements massifs qui sont difficiles à maintenir comme facebook, gmail, etc. et utilisez une table différente pour un ensemble d'enregistrements pour un système simple... c'est juste mon opinion... j'espère que cela peut aider... faites-le... vous pouvez le faire... :)

1 votes

"Utilisez une énorme table si vous avez un grand nombre d'enregistrements " Mais Facebook, Google ne stockent pas les données des utilisateurs dans une seule table, ils les séparent en plusieurs tables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X