2016-04-04 17 views
0

Ruby on Railsと追加専用データベース(Google BigQuery)を使用して、ソフト削除のベストプラクティスは何ですか?私が検討しているパターンは、更新/削除ごとに新しい行を追加し、最新のレコードのみを収集することです。しかし、私はアクティブレコードでそれを行うためのきれいな方法がわからない。その他の推奨パターン/ベストプラクティスRuby on Railsでの追加データベースによるソフト削除

+0

@MikhailBerlyantを探求することをお勧めします、Active RecordはRubyの上のクエリインターフェイスですRails。 – Gregology

答えて

1

大きなクエリは、大量のデータセットに対する分析用です。
この場合、新しい更新/削除行を追加し、履歴行を「維持」することで潜在的に導入される遅さを無視することができます。

BigQueryでは、最新のバージョンの行をwindow functionで取得するのは簡単です。あなたは過去のデータを使用して履歴分析を行う必要がある場合たとえば、「ID」を仮定すると、レコード/行と「TS」を定義する主キーは、タイムスタンプ

SELECT <fields list> FROM (
    SELECT <fields list>, ROW_NUMBER() OVER(PARTITION BY id ORDER BY ts DESC) AS num 
    FROM YourTable 
) 
WHERE num = 1 

です

- ここで行く - それは簡単です。その時の行のそれぞれのバージョンを表す選択を行います。

あなたは歴史的なバージョンを必要としない場合は、定期的に清掃を行うことができます - このために、あなたが一日で仕切られたデータ(または月またはあなたのケースでで仕切られるものは何でもlese dimantionより良いフィット)を維持する方が良い
BigQueryはしていますパーティション表を照会するための優れたサポート - Table wildcard functions

あなたはBigQueryのに固執する場合 - これは良いアプローチとなります
私はそれをより

1

ここで考慮する必要があるのは2つあります。どのように本物のあなたの改訂履歴が必要ですか、そしてパフォーマンスはどれくらい重要ですか?

これを行うには、レコードのJSONコピーを履歴テーブルに保存します。これは簡単ですが、このデータが将来のバージョンの表と互換性があるという保証はありません。つまり、簡単に復元できないことがあります。

削除または履歴バージョンでプライマリテーブルを汚染しないでください。それは厄介なことにつながり、残酷に質問するのが遅くなります。

+0

行がほとんど削除または更新されなくてもクエリが遅くなるのですか? – Gregology

+0

実際にどのくらい頻繁に発生するかにかかわらず、テーブルに対する各クエリごとに削除または改訂をテストする必要があるため、時間がかかります。 'SELECT * FROM pages WHERE id = 1'は' SELECT * FROM pages WHERE instance_id = 1 AND deleted_at IS NULL ORDER BY revised_at LIMIT 1'のようになります。 – tadman

関連する問題