0

私はRails Appから同じ構成とテーブルの別のデータベースに1人のユーザーのデータをダンプ/転送する必要があるというシナリオを持っています。例えば、アプリケーションはA社が支払う停止した場合に私の要件は、あるRails - 別のIDを持つ別のDBにデータを移行する

class Company < ActiveRecord::Base 
    has_many :depots 
    has_many :users 
    end 

    class Depot < ActiveRecord::Base 
    belongs_to :company 
    has_many :products 
    end 

    class User < ActiveRecord::Base 
    belongs_to :company 
    end 

    class Product < ActiveRecord::Base 
    belongs_to :depot 
    end 

として構築されて、私はきれいで、彼らが戻ってきたら、私の実際のDBを維持するために、別のDB(例えばdatabse2)に自分のデータをダンプすると、支払いを開始し、私はこのデータを元に戻したい。

第2の要件は、database2にすでにいくつかのデータがあることです。だから私はすべてのレコードを保持する必要があり、私はassociationAをそのまま維持しているdatabase2に保存している間にcompanyAのIDを変更したい(同じIDの会社があるので)。これは愚かなことかもしれませんが、それが私の必要条件です。 私はPostgresを私のアプリケーションDBとして使用しています。 何かが助けますか?

+0

IDが変更されず、シーケンスジェネレータを変更しない限り、あなたはうまくいくはずです。 IDを再発行しないでください。それはただの無謀です。簡単な間違いのために、ある企業が別の企業のデータを「継承」するリスクを冒します。 – tadman

+0

私はレコードを複製し、それをActiveRecordとAmoebaのような宝石を使って新しいDBに保存しようとしていましたが、nil parent-id制約のモデルで多くのバリデーションがあるので、 –

+0

あなたが最初に質問する必要があるのは、ストレージのオーバーヘッドが窮屈である場合、最初にこれを行う必要があるかどうかということです。もう1つのことは、すべてをシリアライズしてファイルとしてダンプし、後でデータベースに逆シリアル化してデータベースに戻すことができるかどうかを調べることです。これを例としてgzipを使ってJSONにすることができます。このデータをオンラインにする必要がある場合を除いて、2番目のデータベースを明示的に必要とすることはありません。 – tadman

答えて

1

あなたは調べてみる価値ここではいくつかのオプションがあります。

  1. クライアントは、IDフィールドを持つ完全なデータベースに持っていたすべてのものをコードしている特異なJSONファイルでの出力のすべてを。
  2. 宛先サーバにインポートできる一連のCSVファイルをダンプします。
  3. ファイルを実行するだけで適切にデータを復元する単一の.sqlファイルをダンプします。

最初のオプションは最もエレガントですが、おそらく最も多くの作業が必要になります。これは、簡単に解析できるきれいで整ったファイルにデータをアーカイブする機能を提供します。

2番目のオプションは、あなたが持っているデータの種類によっては問題ないかもしれないし、ひどく醜いかもしれません。おそらく動作しないバイナリデータが含まれていても、きれいなテキストのみの列と表形式のデータの場合、通常はかなり効率的です。ここでの利点は、すべてのデータを解析することなく、データの一部を選択的にロードできることです。

3番目のオプションは簡単に解析できないため、使用するには復元する必要がありますが、実際に挿入するのは本当に簡単です。あなたはアーカイバを書くだけでよく、特定の修復ツールは必要ありません。

どのようなアプローチをとっても、ID番号が決して再発行されないことを絶対に確信する必要があります。穴を埋めるためにシーケンスジェネレータをリセットしないでください。また、データベースを移動するとこれらのポートもポートされ、正しく設定されているかどうかテストしてください。最後にIDの競合が必要です。

IDの競合が本当に心配な場合は、競合が基本的に無関係なものすべてに対してUUIDを使用するなどの非数値IDに切り替えることができますが、これはコストなしではありません。

+0

物事がソートされるかどうか試してみましょう。 –

関連する問題