2010-03-12 10 views
1

J'ai plusieurs ensembles de données massifs (multigigaoctets) que j'ai besoin d'importer dans une application Rails. Les ensembles de données sont actuellement chacun dans leur propre base de données sur ma machine de développement, et j'ai besoin de lire à partir d'eux et de créer des lignes dans les tables de ma base de données Rails en fonction des informations qu'ils contiennent. Les tables de ma base de données Rails ne seront pas exactement les mêmes que celles des bases de données sources.Le moyen le plus efficace d'importer des jeux de données volumineux dans une application Rails?

Quelle est la manière la plus intelligente de s'y prendre?

Je pensais aux migrations, mais je ne sais pas exactement comment connecter la migration aux bases de données, et même si cela est possible, cela va-t-il être ridiculement lent?

+0

Quels SGBDR utilisez-vous? –

+1

Comment l'ancienne base de données et la nouvelle base de données seront-elles différentes? Si les modifications sont superficielles (noms de colonnes, etc.), je les exporterais manuellement de l'ancienne base de données vers le nouveau, puis j'exécuterais une migration pour modifier les colonnes. –

+0

Je suis sur Postgres. Je n'ai pas vraiment étudié les ensembles de données à ce stade pour dire combien de changements seront nécessaires, mais au minimum, il y aura des colonnes renommées et des colonnes supprimées. Je ne suis pas sûr si cela fait une grande différence, mais parmi les tables copiées seront aussi des tables jointes, et d'autres tables liées par foreign_keys. –

Répondre

1

sans voir les schémas ou connaître la logique que vous souhaitez appliquer à chaque ligne, je dirais que le moyen le plus rapide d'importer ces données est de créer une vue de la table que vous souhaitez exporter dans l'ordre de colonne souhaité (et traitez-le en utilisant sql) et faites un select outfile sur cette vue. Vous pouvez ensuite prendre le fichier résultant et l'importer dans la base de données cible.

Cela ne vous permet pas d'utiliser des validations de modèle de rails sur les données importées.

Sinon, vous devez aller lentement et créer un modèle pour chaque source db/table pour extraire les données (http://programmerassist.com/article/302 vous indique comment vous connecter à une autre base de données pour un modèle donné) et l'importer de cette façon. Cela va être assez lent, mais vous pouvez configurer une instance de monstre EC2 et l'exécuter aussi vite que possible.

Les migrations fonctionneraient pour cela, mais je ne le recommanderais pas pour quelque chose comme ça.

+0

Je suis assez faible sur la base de données-fu, dans une approche comme celle-ci serais-je capable de conserver les relations entre les modèles dans l'ensemble de données original? Il me semble que si j'importais foreign_keys, je devrais aussi importer les clés primaires afin de conserver les relations, et pour conserver les clés primaires, j'aurais besoin d'importer les données dans une table vide. Je pourrais éventuellement déverser mes tables existantes dans un fichier et les réimporter ensuite, en faisant correspondre manuellement leurs relations foreign_key, mais cela semble évidemment une énorme douleur. Ou y a-t-il quelque chose de grand qui me manque? –

+0

Vous devrez probablement les importer dans une table vide si vous utilisez la méthode dump/reimport. Si vous avez créé un modèle pour les données et que vous avez importé des modèles via des rails, vous ne le feriez pas (car vous pourriez utiliser les associations pour créer et gérer les éléments associés). –

0

Depuis georgian suggéré, je vais poster mon commentaire comme une réponse:

Si les changements sont superficiels (les noms de colonnes modifiées, colonnes supprimées, etc.), je voudrais juste manuellement les exporter de l'ancienne base de données et dans le nouveau, puis exécutez une migration pour modifier les colonnes.

Questions connexes