0

アプリケーションで、ユーザーのアクションを別のユーザーに反映するテーブルを作成したいと考えています。

私は2つの解決策を考えています。どちらがより高速になるか知りたいですか?

1)

ID | source_user_id | target_user_id | action_type

このオプションでは、アクションごとに行を作成します

2)

Id | source_user_id | target_user_id | action_x | action_y | action_z

このオプションでは、他のユーザーが使用できるすべてのアクションの行を作成します。アクションが実行されない場合、フィールドは NULL 値に設定されます。この行は、少なくとも 1 つのアクションが実行された場合にのみ作成されます。

また、なぜ最良の選択が

私の下手な英語ですみません。
ありがとうございました

4

3 に答える 3

1

間違いなく2番目ではありません。私は変更されたナンバーワンで行きます:

ID | source_user_id | target_user_id | **action_id**

次に、テーブルを作成しますactions

ID | action_type | action_info | etc

これにより、複数の異なるアクションを実行できるようになり、より柔軟になります。「他のユーザーが使用できるすべてのアクションの行を作成します」と言いましたが、レイアウトによると、ユーザー間で使用できるアクションごとに別の列を作成するということです。これは、これを処理するための非常に悪い方法です。

于 2013-03-27T23:15:59.470 に答える
1

何のために速くなりますか?

特定のユーザーのすべてのアクションを取得するには、2 番目のソリューションの方が高速ですが、これはほんのわずかかもしれません。

新しいアクションを追加するには、最初のソリューションの方がはるかに高速です。2 番目の解決策では、テーブルを再編成する必要があります。

次に、2 番目のケースの列に入力する内容を言いません。2,000 文字の長さの文字列を入力する場合、特に値の代わりに ID を使用することについての hellohellosharp の提案により、最初のケースの方がはるかに高速になる可能性があります。短いレコードと少ない I/O は、大きなテーブルを小さな参照テーブルに結合する必要があることを補うはずです。

パフォーマンスに関する質問に実際に回答するのに十分な情報を提供していないため、最良の回答はデータベースの設計に焦点を当てることです。このため、アクション テーブルには、おそらく自動インクリメント ID、2 つのユーザー ID、アクション ID、および発生時の日付/時刻フィールドが必要です。適切なインデックスを使用して、特定のユーザーまたはユーザー/アクションに関する情報を取得すると、アプリケーションのパフォーマンスが十分に向上するはずです。

于 2013-03-27T23:33:48.557 に答える
0

テーブル構造を定義する前に、予想されるクエリのうちパフォーマンスが重要なクエリを決定する必要があります。and で利用可能なすべてactionの s をsourcetarget user取得していますか? または、システムで現在使用可能な の数を取得しaction_typeていますか? テーブルの作成方法は、それに応じて大幅に異なる場合があります。

それが十分に決定された後、ニーズに合わせて最適化されたテーブルを構築するために、次のような多くのテクニックを使用できます。

  1. 通常は一緒に取得されるデータ単位を同じテーブルに埋め込みます。
  2. インデックス列;
  3. 他にもたくさんありますが、最初の 2 つは最も基本的なものです。
于 2013-03-27T23:33:08.170 に答える