3

特定のユーザーのサイト統計を保存するための最良の方法は何ですか?基本的に、ユーザーが特定のタスクを実行した回数を保存したいと思います。データは潜在的に大きなテーブルから取得され、頻繁に参照されるため、COUNT()を避けて、独自のテーブルに格納したいと思います。

方法A

次のフィールドを含むテーブルを作成し、各ユーザーの行を作成して、各フィールドのカウントを保存します。

User_id | posted_comments | comment_replies | post_upvotes | post_downvotes
50        12                7                 23             54

方法B

1つのテーブルにアクションを格納し、別のテーブルにそのアクションのカウントを格納します。

表1:

Id | Action
1  | posted_comments
2  | comment_replies
3  | post_upvotes
4  | post_downvotes

表2

User_id | Action | Count
50      | 1      | 12
50      | 2      | 7
50      | 3      | 23
50      | 4      | 54

合計で25〜30を超えるアクションがあることはわかりませんが、方法Aのように水平方向に保存するには多すぎるかどうかはわかりません。

4

2 に答える 2

1

あなたはあなたの質問に答えたと思います。アクションがわからない場合は、各アクションを別々の行に保存します。それが2番目のオプションになります。

テーブルに適切なインデックスがあることを確認してください。1 つの可能性は(user_id, action, count). このインデックスを使用すると、ユーザー レベルでテーブルを高速に非正規化できます。

問題が明確に定義されていて、テーブルの列を追加/削除/名前変更する必要がない場合は、最初のバージョンも実行可能です。それ以外の場合は、行の挿入に固執してください。クエリは少し複雑に見えるかもしれませんが、アプリケーションはより柔軟です。

于 2013-03-04T20:26:15.140 に答える
0

私には典型的な BI の質問のように思えます。本当の問題は、次元にいくつの「アクション」があるかではなく、それらがどのくらいの頻度で変化するかです。

表 A は非正規化されており、すばやく簡単に読み取ることができます。「SELECT」を使用すると、適切な形式で情報を取得できます。

テーブル B は正規化されており、保守が容易です。アクションのリストを事前に定義するのが難しい場合は強くお勧めします。動的な場合は必須です。

テーブル A からテーブル B に行ったり来たりすることは、ピボット操作として知られています。これには標準的なツールがありますが、手動でコーディングするのは決して簡単ではありません。したがって、1970 年の Codd 以来、すべての機関がそう言っているからといって、表 B の方が優れているという結論にすぐに飛びつかないでください。

COUNT(*) テーブルがどのくらいの頻度で読み取られるかを自問することをお勧めします。昨日の統計を受け入れることができる場合は、毎晩両方のテーブルを計算してください。

于 2013-03-04T20:37:01.433 に答える