カスタム データ セットを格納する Rails アプリケーションを作成中です。より具体的には、リーダーボードのアーカイブを保存しています。Leaderboard にはそれぞれ、カスタム フィールドを持つことができる LeaderboardEntries のセットがあります (つまり、すべての Leaderboard が同じフォーマットを持つわけではありません)。
簡単な例:
Leaderboard 1 (Fields)
-------------
7_day_exponential_moving_average
total_count
Leaderboard 2 (Fields)
-------------
10_day_exponential_moving_average
total_count
現在、リーダーボードのすべてのエントリを「データ」と呼ばれるリーダーボードのフィールドにシリアル化しています。その結果、30,000 以上のオブジェクトに対して計算を実行し、結果を 1 つのフィールドに格納しています。
非同期で計算を実行するときにこれに欠陥があることがわかり始めています (すべての計算が完了するのを待ち、計算が完了したかどうかを監視し、すべてのデータを保存する必要があります)、LeaderboardEntry という別のモデルを作成しているように見えますより理にかなっています。私が疑問に思っているのは、30,000 の個別のオブジェクトを格納してクエリを実行することと、30,000 のエントリすべてを 1 つのフィールドに格納することのパフォーマンス ヒットです。
私は、1 回の応答で 1 回の要求を実行すると、はるかに優れたパフォーマンスが得られると考えました。(すなわち
SELECT serialized_data FROM leaderboards WHERE leaderboard_id=123 <-- 1 row with a very large field
対
SELECT * FROM leaderboard_entries WHERE leaderboard_id=123 <-- 30,000 rows with small sets of data
シリアル化されたフィールドに格納するという私の仮定は正しいですか? それとも、エントリを個別に保存することはそれほど大したことではありませんか? ここで私が考えたもう 1 つの考え: MongoDB のような nosql ソリューションを使用する方が効率的であり、leaderboard_entry フィールドで並べ替えて、結果を少量 (一度に 50 個の結果) に制限することができます。
最終的には、1 日あたり 100 万以上のリーダーボード エントリ (20 以上のリーダーボードの場合) を生成することになり、それらを格納する最も効率的な方法を見つけようとしています。
ありがとう!