3

Railsアプリケーションにモデルとしてロードしたい何百万行ものデータを扱っています。私はデータベースとしてMySQLを使用しており、Rails2.3.14を使用しています。

私の同僚の1人は、Rails ActiveRecordシステムをバイパスして、MySQLに直接レコードを追加することはお勧めできないと言っています。彼は詳細が不足していますが、その要点は、RailsがActiveRecordシステムを使用すると多くの「魔法」を実行し、このシステムの外部でデータを入力するとRailsを混乱させるということです。誰かがこれが正確かどうかについて詳しく説明できますか?

ActiveRecordを介してRailsにデータをロードする必要がある場合は、activerecord-importプラグインがこのタイプのジョブを実行する方法であることを読みました。

大量のデータをRailsにロードするための最良のアプローチに関するフィードバックを歓迎します。

4

3 に答える 3

3

考慮すべき6つの主要な項目を考えることができます。最後の5つは、Railsの「魔法」に関連しています。

  1. スピード。これは巨大です。Active Record、一度に1つずつ挿入すると、行ごとに1秒かかる場合があります。つまり、100万行で100万秒になります。これは、11.5日であり、多くの人に悪いラップを与えることになります。

  2. 検証。データベースがモデル/既存のデータと同じ検証を実施していることを確認する必要があります。

  3. タイムスタンプ。railsと同じ方法でcreated_at/updated_atを更新する場合は、タイムスタンプを手動で更新する必要があります。

  4. カウンターキャッシュ。カウントを手動で更新する必要があります。

  5. ActiveRecord gemたとえば、モデルレコードへのデータ変更のレコードトレイルを保持できるacts_as_auditedを使用する場合、ActiveRecordの外部にいるとその機能はありません。

  6. モデル層のビジネスロジック。 優れたプログラマーは、可能な場合はモデル(またはそれ以上)レベルで機能を配置しようとします。これには、他のデータの更新、電子メールの送信、ログへの書き込みなどの項目が含まれる場合があります。これは、ActiveRecordが呼び出されなかった場合は発生しません。

于 2012-05-24T00:14:47.827 に答える
1

MySQLに直接挿入すると、モデルオブザーバー、カウンターキャッシュ、およびアプリがActiveRecordに依存するその他の機能をバイパスする可能性があります。MySQLに直接データを挿入する場合は、これに注意し、ActiveRecordが行うすべての変更と検証を考慮に入れるようにしてください。作成する挿入スクリプトが何であれ、同じ変更を加える必要があります。

例:テーブルがstudentsあります。teachersにレコードを挿入すると、通常はActiveRecordが増分するカウンターキャッシュ列studentsを更新する必要がある場合があります。teachers.students_count

それ以外に、データを直接挿入できない理由はありません。これらの懸念を超えて、懸念は根拠のないFUDです。

ActiveRecordを使用する際の本当のボトルネックは、非常に複雑なActiveRecordモデルオブジェクトのインスタンス化です。挿入/インポートスクリプトをrakeタスクとして記述し、 arel(ActiveRecordを強化する低レベルのクエリインターフェイス)またはのようなgemを使用することを検討することをお勧めしますactiverecord-import。これらのアプローチは両方とも、通常の検証、オブザーバー、カウンターキャッシュなどをスキップする(または少なくともできる)ため、それを説明するためのカスタムロジックが必要になることに注意してください。

于 2012-05-23T23:39:23.943 に答える
0

直接ロードしない理由はいくつかあります。これらのいくつかはあなたに当てはまるかもしれませんし、当てはまらないかもしれません。

データ検証-検証されていないデータを読み込んでいます。Railsアプリでは、読み込まれるデータについて特定の仮定が行われている可能性があります。また、検証されていないデータは、アプリ内で機能するため、いくつかの興味深い問題を引き起こす可能性があります。

データ操作-これはデータ検証にいくらか関連していますが、何らかの種類のデータ操作(Webでのデータ入力とデータベースへの挿入の間)を行う場合は、アップロード時に少なくともこの操作を再作成する必要がありますそれ。

全体として、これを行うのはおそらく最善の方法ではありませんが、それはRailsの「魔法」によるものではなく、直接ダンプを実行して再作成していないという前提がデータに組み込まれているためです。

于 2012-05-23T23:34:54.103 に答える