1

Ruby on Rails3.0.7とMySQL5を使用しています。私のアプリケーションには、TABLE1とTABLE2などの2つのデータベーステーブルがあり、パフォーマンス上の理由から、TABLE2の一部のデータを非正規化して、その1つでTABLE1の値を繰り返しています。ここで、TABLE1で、これらの関連する値のいくつかを更新する必要があります。もちろん、TABLE2の非正規化された値も適切に更新する必要があります。

これらの値をパフォーマンスの高い方法で更新するにはどうすればよいですか?つまり、TABLE2に多くの値(1.000.000以上)が含まれている場合、両方のテーブル(テクニック、プラクティスなど)を更新し続けるための最良の方法は何ですか?

データベーステーブルの更新にかかる時間中に何が起こる可能性がありますか?たとえば、ユーザーは、これらの非正規化された値を含むいくつかのWebサイトページにアクセスする際に問題が発生する可能性がありますか?もしそうなら、それらは何ですか、そして私はどのように状況に対処できますか?

4

2 に答える 2

3

この状況を処理する方法はいくつかあります。

  1. データベーストリガーを使用できます。これはデータベースにとらわれないオプションではなく、私が知る限り、これに対するRoRサポートは存在しません。状況にデータの不整合がまったく必要ない場合これはおそらく目標を達成するための最もパフォーマンスの高い方法ですが、私はDBの専門家ではありません。
  2. バッチ操作を使用して、2つのテーブルを定期的に同期できます。この方法では、2つのテーブルを分散させてから、データを頻繁に再同期することができます。状況によってこのドリフトが発生する可能性がある場合は、営業時間外にDBを更新できるため、これは適切なオプションです。5分ごとに同期を行う必要がある場合は、他のオプションを検討することをお勧めします。これはrubyコードで処理できますが、何らかのバックグラウンドジョブランナー(cron、delayed_job、redisなど)が必要になります。
  3. Railsモデル内からコールバックを使用できます。を使用できます"after_update :sync_denormalized_data"。このコールバックは、データベースレベルのトランザクションでラップされます(データベースがトランザクションをサポートしていると仮定します)。Railsレベルのコード、一貫性のあるデータがあり、毎回2回の書き込みを行うことを犠牲にして、バックグラウンドプロセスは必要ありません。
  4. 私が考えていなかったいくつかのメカニズム....

これらのタイプの問題は、アプリケーション固有のものです。同じアプリケーション内でも、関連する柔軟性とパフォーマンスの要件に応じて、複数の方法を使用できます。

于 2011-06-30T04:22:53.307 に答える
1

または、正規化されたデータセットを維持し、2つの非正規化テーブルを作成することもできます。そして定期的にそれらを同期します。他の方法では、データを維持するための正規化されたテーブル構造(挿入/更新/削除)を持ち、レポートを実行するためのマテリアライズドビューを記述します。これは、非正規化ビューによって達成されていることです。要件に応じて、マテリアライズド・ビューのデータ更新パラメーターを設定できます。

于 2011-06-29T09:23:10.530 に答える