web-dev-qa-db-fra.com

Quel est un bon moyen de stocker un grand nombre de colonnes?

J'ai un problème de décider comment stocker ces données dans ma base de données. Des suggestions sur la meilleure façon de le faire? Je ne connais pas beaucoup de bases de données sur les bases de données, je pourrais ajouter.

J'ai des données qui arrivent en formatées, mais plutôt que 4, le nombre de colonnes est d'environ 240, chaque date comporte 240 valeurs uniques associées à celle-ci:

Date/Time 200,00 202,50 205,00  
2010.11.12  13:34:00  45,8214 43,8512  41,5369   
2010.11.12  13:35:00  461,9364  454,2612  435,5222 

En outre, les lignes sont associées à des données de données.

Ma première pensée était d'avoir une table comme si: Dataid (PK), DataSiteid, paramétrage, date, valeur, avec un index sur la base de données, le paramètre et la date. Le paramètre indique une autre table qui stocke les en-têtes de colonne d'entrée (200,00 202, 50 205,00 ...).

Ma deuxième pensée était simplement d'avoir une table avec toutes les 240 colonnes impaires. J'ai mangé quelques autres façons, mais ils sont également assez insatisfaisants.

Le problème que j'ai avec ma première solution (pas un problème aussi énorme, mais je n'aime pas cela), est que la date et la machine de données seront répétées pour toutes les valeurs 240 de cette ligne d'entrée, il en utilise donc un peu mal d'espace supplémentaire.

Il y aura environ 40 Go de données par an à venir (dans le format texte ci-dessus), et les données seront recherchées par datasite, paramètre et date. La quantité de données à venir sera très probablement quadruplée dans un an environ.

Des bonnes idées? Merci, James

Edit : Il s'agit de données de la série chronologique, les colonnes étant des mesures à différentes longueurs d'onde. Les données voudront être analysées dans une plage de longueurs d'onde relativement étroite. Il pourrait également y avoir des longueurs d'onde supplémentaires ajoutées à un moment donné à l'avenir.

Edit : Merci pour les réponses Les gars, je l'apprécie vraiment :) Je pense que je peux probablement trouver le temps de gérer certaines expériences avec 500 Go de données de test. Je posterai avec des conclusions;)

18
James

Vous pouvez faire une affaire de toute façon, mais si les données vont être utilisées pour l'analyse et que vous souhaitez souvent voir plusieurs colonnes à partir de ces données en même temps, accédez à la table large. Assurez-vous de connaître vos bases de données de la quantité de colonne et des limites de taille des lignes. Assurez-vous d'obtenir les données de type de données. Si de nombreuses colonnes sont NULL, SQL Server vous permet d'optimiser la table pour cela. Vous pouvez également envisager d'utiliser une solution NOSQL (non seulement SQL) pour l'analyse de ce type de données.

Si ces données seront inférieures à analyser, vous voudrez peut-être normaliser celui-ci comme indiqué dans votre question.

10

J'ai eu une situation très similaire à la vôtre, 257 champs avec 30-50 Go d'une année à venir. J'ai fini simplement de garder cela simple, une longue table Big Boy dans SQL Server. Mes données ont été interrogées un peu, mais principalement à la date et cela a bien fonctionné.

J'aurais pu briser les données en petits mandrins logiques (groupes de 50 ou plus), mais dans ce cas, il n'y avait vraiment pas beaucoup d'avantage pour cela, alors je me suis sauvé la peine.

Si je me sentais envie maintenant, je pourrais envisager une option NOSQL qui est une meilleure forme en théorie, mais avec des données critiques en mission, essayer de nouvelles choses ne sont pas toujours idéales pour les nerfs.

6
henry.oswald

Donc, pour répondre à la question tardivement à ma propre question (le projet n'a jamais été poursuivi à la fin), lorsque j'ai réussi à obtenir un temps libre, j'ai rempli une table d'essai avec 500 Go de données avec la table disposée comme suit:

Ma première pensée était d'avoir une table comme si: Dataid (PK), DataSiteid, paramétrage, date, valeur, avec un index sur la base de données, le paramètre et la date. Le paramètre indique une autre table qui stocke les en-têtes de colonne d'entrée (200,00 202, 50 205,00 ...).

La configuration de la base de données était l'installation standard PostgreSQL sur une ancienne machine double noyau avec 3 Go de RAM. J'ai rencontré une douzaine de requêtes différentes en sélectionnant simplement des données par date de données et paramétrage, de la moyenne des données sur une période de 1 heure, une période de 1 jour et l'insertion de nouveaux morceaux de données. De la mémoire, toutes les questions ont pris moins d'une seconde à exécuter. C'était certainement beaucoup plus rapide que prévu et assez utilisable. Une chose que je n'avais pas pensé était que, avec la table indexée de cette façon, le fichier d'index était de près de 500 Go également, alors disposera de la table de 240 colonnes larges, au lieu de conserver une grande partie de l'espace disque.

6
James

À Postgres, je résoudrais élégamment cela avec un type de tablea ou A Varray à Oracle.

3
Gaius

Je ne sais pas si c'est utile pour votre problème, mais pour les colonnes, je n'ai pas besoin de faire des demandes directes sur (cols que je n'ai jamais mis dans mon état) et qui ne sont que informatifs quand je veux toutes les infos sur certains Des lignes spécifiques, je les combine dans un champ de blog JSON formaté.

3
user649

Je prendrais probablement la décision finale de la conception dépendante de la distribution des paramètres neutres. C'est-à-dire que s'il existe quelques paramètres qui sont interrogés presque exclusivement, je mettais leurs valeurs dans une table chaude et les valeurs restantes dans une autre Table froide .

OTOH, si leur distribution de requête est plus ou moins même, je chargerais un échantillon de jeu de quelques jours dans une table où les enregistrements conservent toutes les valeurs afin de voir quel est le rapport entre les enregistrements/DB-Blocks (ou si Il y a même un problème de chaîne de rangée , qui est susceptible). Selon cela, je ferais alors une décision de conception supplémentaire.

Après l'avoir lu, je ferais probablement les deux approches pour une descente en parallèle.

2
René Nyffenegger

Je relisais la question - si je l'ai correct, alors dans chaque enregistrement, vous obtenez en tant qu'entrée, il existe différentes valeurs suivies (sur la base du paramètre):

Le paramètre indique une autre table qui stocke les en-têtes de colonne d'entrée (200,00 202, 50 205,00 ...).

... Je ne connais pas assez de suffisamment sur la manière dont vous interagissez avec les données, mais je serais enclin à utiliser une autre option - avoir une table séparée pour chaque identifiant de paramètre, puis si nécessaire avoir une vue qui serait Rejoignez les différents paramètres différents par date et emplacement dans la table plus large (colonne 240); S'il était important de conserver le type de données accessible dans la vue, vous pouvez utiliser un UNION plutôt qu'un JOIN, mais les colonnes seront peuplées de peuples.

2
Joe