1

PHP/MySQL でファンタジー ベッティング リーグ アプリケーションを作成している最中で、次の 2 つのテーブルがあります。

実績- 現在、プレイヤーの歴代実績を次の列で保持しています。

user_id
total_gold_medals
total_silver_medals
total_bronze_medals
total_bets
total_winnings

ベット- 各ユーザーが行った個々のベットのリストで、そのベットがメダルを授与された場合、および受け取った場合の賞金の額が表示されます。

date_placed
user_id
winnings
gold_medal
silver_medal
bronze_medal

achievements現在、予測はライブ イベントに基づいているため、結果が時々変わる可能性があるため、 2 週間が経過するまでテーブルをインクリメントしたくありません。

bets現在、同様のデータに対して 2 つのテーブルを用意している理由は、現在の週にそのデータベースのごく一部しか必要としない場合に、増え続けるテーブルからクエリを実行して COUNT/SUM を実行したくないためです。

95% の時間はachievementsテーブル内のデータのみを使用するため、最初に考えたのは、2 週間が経過した後にデータを から に移動し、それらのベットを新しいフィールドで「アーカイブ済み」としてマークして、betsそうしないようにすることでした。 t はそれ以降の SUM() に含まれます。ただし、データを 2 つの場所に保持するこの方法は、非常に不器用な方法のように思えます。別のテーブル構造にする必要がありますか? これについてどう思いますか?achievementsarchived

4

2 に答える 2

1

あなたが達成しようとしていることは明らかではありません。原則として、ベット テーブルから計算 (カウント、合計) できるため、アチーブメント テーブルの必要性は明確ではありません。タイムスタンプがある場合bets、過去 2 週間を考慮に入れなくても簡単に達成できます。

パフォーマンスが重要な場合は、合計用のセカンダリ テーブルを作成する、いわゆる集計テーブル (一部の DB ではマテリアライズド ビューと呼ばれます) が有効なアプローチの 1 つになる可能性があります。

ただし、アプリケーション ロジックが安定しており、パフォーマンスの問題が予見できる場合にのみ、パフォーマンスの最適化を構築することを強くお勧めします。

PS .: ただし、シルバー、ブロンズ、ゴールドの列の使用には疑問を呈し、代わりに目的のために (数値) 型の列を導入します。

于 2013-11-08T14:40:36.190 に答える