Question

J'ai remarqué que beaucoup de gens citent ici des tables avec des 20+ (je l'ai vu jusqu'à 55) colonnes dans une table. Maintenant, je ne prétends pas être un expert en conception de bases de données, mais je l'ai toujours entendu dire que cela est une pratique horrible. Quand je vois cela, je suggère habituellement diviser en deux tables avec une relation un à un: l'un contenant les données les plus fréquemment utilisées, l'autre avec les données moins souvent utilisées. Bien que dans le même temps, il y a la question de la performance possible (moins JOIN et autres). Donc, ma question est la suivante:

En ce qui concerne les bases de données à l'échelle très grande, est-il vraiment un avantage d'avoir une grande quantité de colonnes, en dépit du fait que ce généralement conduit à plusieurs valeurs NULL?

Ce qui est plus d'un coup de performance: beaucoup de colonnes avec beaucoup de NULLs, ou moins de colonnes avec beaucoup de JOIN

Était-ce utile?

La solution

La conception de la table dépend de l'entité dont il a besoin de stocker. Si toutes les données appartient ensemble, puis 50 colonnes (ou même 100) pourrait être la bonne chose à faire.

Tant que la table est normalisée , il n'y a pas de règle générale concernant la taille, à l'exception de capacités de base de données et la nécessité d'optimiser.

Autres conseils

Je suis d'accord avec Oded. J'ai vu des tables avec 500 colonnes en eux, et toutes les colonnes étaient les au bon endroit. Il suffit de considérer le nombre de faits, on pourrait vouloir stocker sur un objet de tous les jours, et vous verrez bientôt pourquoi.

Si cela se révèle peu pratique pour sélectionner toutes les colonnes, ou de spécifier les colonnes à sélectionner lorsque vous ne souhaitez que dans une petite proportion d'entre eux, vous trouverez peut-être utile de définir une vue.

  

Combien de colonnes est trop de colonnes?

Lorsque vous vous sentez qu'il n'a plus de sens ou convient d'ajouter une autre colonne.

dépend généralement de l'application.

a odbc une limite de caractère de 8000 .... c'est donc une limite physique au-delà duquel les choses se très frustrant.

J'ai travaillé sur une table qui avait 138 colonnes .. il était horriblement écrit et aurait pu être normalisée. Bien que cette base de données semblent d'été la création d'une personne se demander pourquoi il y a des conventions dans la conception de base de données et de décider de les tester à la fois.

Avoir des tables très large aplati est assez courant lorsque vous entrez dans le stockage de données et les serveurs de rapports. Ils sont juste beaucoup plus vite et cela signifie que vous ne devez pas stocker votre base de données entirley dans la RAM pour la performance.

D'après mon expérience, il est préférable d'avoir moins rejoint ceux ont tendance à se produire trop souvent surtout dans les grandes bases de données. Tant que vos tables de base de données sont conçus pour stocker seule entité (étudiant, enseignant, etc.) cela devrait être ok. Alors que ce sera représentée comme un objet dans votre code plus tard. Donc, si vous divisez l'entité à plusieurs tables, vous devrez utiliser plusieurs jointures afin de remplir votre objet plus tard. Aussi, si vous utilisez ORM pour générer votre couche d'accès aux données (telles que Linq en .Net) est va générer des classes séparées pour chaque table (avec bien sûr une relation entre eux, mais encore) et ce sera plus difficile à utiliser.

Une autre chose est que vous pouvez spécifier les colonnes à retourner dans votre requête et cela réduira les données transmises à votre application, mais si vous avez besoin, même une seule colonne d'une autre table, vous devrez faire la jointure. Et dans la plupart des cas que vous avez tant de colonnes, la probabilité d'avoir grande quantité de données stockées dans la db est élevée. Donc, cette jointure nuiraient plus, que les valeurs NULL.

Chaque projet que j'ai travaillé est différent, vous devez trouver le bon équilibre pour chaque histoire.

Avoir trop de colonnes résulte beaucoup (mauvais) nulls et un objet difficile à manier la table est mise en correspondance. Cela nuit à la lisibilité dans l'EDI et entrave la maintenance (augmentation des coûts de développement). Si vous avez besoin des lectures rapides dans certains cas, utiliser des tables dénormalisées par exemple utilisé uniquement pour des rapports ou des requêtes (recherche du motif « de CQRS »). Oui « personne » a un million d'attributs, mais vous pouvez briser ces tables monothilic pour correspondre à des entités plus petites (conception précède de normalisation) ( « adresse », « téléphone », « passe-temps ») au lieu d'ajouter de nouvelles colonnes pour chaque nouveau cas d'utilisation. Avoir plus petits objets de taille (et tables) apporte tant d'avantages; ils permettent des choses comme les tests unitaires, POO et pratiques solides.

En outre, comme il regarde à botteler nombreuses colonnes pour éviter les jointures, je pense que le gain de performance d'éviter joint est perdue par l'entretien de l'indice, en supposant une charge de travail typique des deux lectures et écritures. Ajout d'index sur les champs de recherche de performance de lecture pourrait être le signe d'un besoin de déplacer ces champs dans leur propre table.

  

Ce qui est plus d'un coup de performance:   beaucoup de colonnes avec beaucoup de NULLs, ou   moins de colonnes avec beaucoup de JOIN?

Il est purement dépend des données que vous stockez, des index que vous faites et ainsi de suite. Personne ne peut vous assurer que l'on travaille mieux qu'un autre sans savoir ce que vous stockez. En général, les règles de normalisation seront « force » vous séparer les données à différentes tables et FKeys utilisateur si vous avez une grande table, mais je suis en désaccord qu'il a toujours une meilleure performance d'une grande table. Vous pouvez terminer par 6-7 niveau se joint à des dizaines de requêtes qui parfois provoquer des erreurs parce qu'il ya beaucoup plus de chances de créer une erreur dans les grandes requêtes dans les simples.

Si vous publiez des exigences de ce que vous faites nous pouvons peut-être vous aider à la conception de la base de données correctement.

Il dépend aussi fortement du cas d'utilisation pour votre table. Si vous souhaitez optimiser pour la lecture alors il pourrait être une bonne idée de garder tous ensemble dans une table.

Dans le monde NO-SQL (cassandra / HBase par exemple), il n'y a pas de contraintes sur le nombre de colonnes et il est en fait considéré comme une bonne pratique d'avoir plusieurs colonnes. Cela vient aussi de la façon dont il est stocké (sans espace). La peine d'instruction.

Quel besoin entreprise a besoin de plus de 60 colonnes dans un ensemble de données, et encore moins un tableau TSQL? S'il y a un tel besoin d'affaires, puis un pivot est en ordre, et les colonnes doivent être rangées. Par exemple, dans l'industrie minière, il peut y avoir 600 mesures différentes prises dans un essai. Le nom de chaque mesure pourrait être un nom de colonne. Mais pourquoi créer une table avec 600 colonnes et de lignes de mesures? Un géologue mesurera chaque jour, peut-être la mine, et remplir le journal de 600 colonnes sur une ligne. Cela semble à moi comme le géologue perdra son esprit, et il ne trouvera pas une feuille de papier assez longtemps. Peut-être un rouleau fonctionnerait, mais il devrait se dérouler le rouleau et le rouler à nouveau sauvegarder.

Il est préférable d'utiliser une seule table par où vous pouvez éviter d'utiliser des jointures tout en interrogeant cela dépend si les colonnes sont de même entité ou entité différente.

Par exemple, supposons que vous faites une conception de base de données pour le flux de travail où certains champs seront édités par les jeunes travailleurs, et certains champs par des seniors. Dans ce cas, il est préférable d'avoir toutes les colonnes d'une seule table.

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