2011-04-05 2 views
0

J'essaye de construire une structure de table de données qui supportera mieux les critères suivants:La meilleure façon de concevoir un tableau de données pour un nombre inconnu de colonnes?

1) Je ne sais pas combien de colonnes la table doit avoir.

  • Je pourrais avoir besoin de 6 colonnes dans certains cas, ou 10 dans d'autres. Je ne m'attends pas à ce que cette table ait besoin de 20 colonnes ou plus, mais je ne peux pas non plus garantir que cela ne sera jamais nécessaire.

2) Je dois prendre en compte l'espace de stockage et la vitesse de reporting.

  • Cette table doit stocker des millions d'enregistrements et les rapports seront exécutés sur cette table. Je sais qu'il est difficile de faire pivoter des tableaux hautement normalisés du point de vue des rapports. Je veux donc procéder à la normalisation de la déclaration. Mais, je ne sais pas si le simple fait de ne pas utiliser un grand nombre de colonnes afin d'éviter une normalisation est une bonne idée car je finirai probablement avec beaucoup de NULLS dans la plupart des colonnes à la fin de la table, et ceux-ci (je pense) prennent tous une certaine quantité d'espace de stockage.

3) Si je dois choisir entre l'espace de stockage et les performances de rapport, je serai du côté des performances. Je ne suis pas un expert en intelligence d'affaires, et je ne suis pas un gourou T-SQL (je vais utiliser SQL Server), et donc je suis sûr qu'il y a des points précis ici que j'ai simplement oubliés. Ainsi, je me tourne à nouveau vers la brillante communauté SO pour obtenir des conseils, et avoir un peu de sens dans mon crâne épais.

Comment concevez-vous la table dans ces circonstances? Quels sont les détails qui me manquent et doivent encore être pris en compte?

+0

Y a-t-il une raison, en plus de votre brève mention du pivotement difficile, que vous écartez d'un ensemble de tables 'product_property' et' product_property_value'? –

+0

Kevin - Est-ce que product_property et product_property_value ont leurs propres problèmes? Tout (dates, nombres) doit être stocké sous forme de chaînes, les contraintes sont difficiles à implémenter, et bien sûr, pivoter même pour les requêtes "select" très basiques. –

+0

Ma compréhension de ces choses est limitée, mais je répugnais à cela pour les raisons citées par Rajesh. – campbelt

Répondre

2

La plupart des conceptions de table générique pour lesquelles les valeurs de colonne sont décidées en fonction des paramètres utilisateur conduiront à des performances médiocres, car toutes les requêtes seront dynamiques.

La chose raisonnable à faire serait de fournir une estimation du nombre de colonnes et de laisser les valeurs inutilisées être nulles initialement. Pouvez-vous donner un exemple de ce à quoi sert votre histoire? Un des exemples qui soulève cette question est quand vous avez une table de produit et certains produits ont seulement 5 attributs et certains ont 50. Comme je l'ai dit ci-dessus, vous feriez mieux de créer la table avec 50 colonnes (si vous voulez tableau des produits) et ayant les autres colonnes comme nul si nécessaire.

Les outils de création de rapports et la plupart des SGBDR gèrent les valeurs nulles lors de l'agrégation et du regroupement.

+0

Rajesh, vous avez une compréhension parfaite de mon problème. Je vais, en fait, construire ces tables pour des produits avec un nombre inconnu d'attributs. Certains produits auront 6 attributs, tandis que d'autres pourraient en avoir 10. Cependant, je ne vois pas le nombre excédant 10 de beaucoup. Ainsi, je pensais à défaut de 20, mais je ne savais pas si c'était la bonne façon d'y aller ou si je simplifiais trop le problème. Plus important encore, je veux savoir ce que je ne considère pas :) – campbelt

5

Les colonnes du tableau représentent les spécifications de l'entité à stocker. Dire que vous ne savez pas combien de colonnes seront stockées signifie que vous ne connaissez pas la spécification de la substance à stocker. Autrement dit, vous voulez construire un système sans savoir ce qu'il va stocker. Les bases de données relationnelles ne sont fondamentalement pas conçues pour gérer ce et fonctionnent bien et peuvent être maintenues. Pour bien fonctionner et être maintenable, les bases de données relationnelles reposent sur le temps nécessaire pour déterminer la nature de l'entité à stocker et ses attributs, puis construire le schéma approprié. Ainsi, la solution la plus performante et la plus facile à maintenir utilisant une base de données relationnelle consiste à construire le schéma tel qu'il est requis, ce qui signifie rassembler les spécifications sur ce qui doit être stocké selon les besoins.Cela dit, il existe des alternatives aux bases de données relationnelles telles que les bases de données «nosql» qui pourraient mieux répondre aux besoins d'une conception uber-élastique qu'une base de données relationnelle. Des exemples de ceux-ci comprennent MongoDB et CouchDB.

+0

Merci, Thomas. Je me demande cependant, que faites-vous quand vous ne savez vraiment pas combien de colonnes seront nécessaires, et il n'y a aucun moyen de savoir? Je veux dire, je peux décider que je n'aurai probablement jamais besoin de plus de X colonnes, mais je construis ces tables pour stocker un nombre inconnu de produits, chacun avec un nombre inconnu de leurs propres attributs à stocker ... – campbelt

+0

@campbelt - Les tables des bases de données relationnelles n'étaient pas conçues pour stocker un ensemble de choses arbitraires. Par exemple, la structure que vous voudriez pour stocker des automobiles est différente de la structure que vous voudriez pour stocker des ordinateurs portables, des vêtements, des sous-marins nucléaires ou des clips. Est-il * possible * de créer une structure dans un SGBDR pour stocker des "choses" sans schéma? Bien sûr, mais cela ne fonctionnera pas bien et ne pourra pas être maintenu, et si les rapports et les performances (et l'échelle) sont importants, alors un SGBDR n'est pas le bon outil. C'est comme utiliser Excel pour écrire un livre. – Thomas

+0

@campbelt - Compte tenu de ce qui précède, si à la place la spécification sur ces données supplémentaires est qu'elle doit être une bourrée arbitraire de données qui ne seront jamais recherchées, analysées, utilisées dans des calculs mathématiques, filtrées, triées ou utilisées autrement que de cracher le contenu entier pour chaque produit à signaler, alors il y a des solutions pour cela. Cependant, ces solutions exigent toutes de la discipline pour ne pas traiter cette liasse de données comme une colonne standard, mais plutôt comme une goutte de notes. – Thomas

Questions connexes