2

私はFirebird2.1を使用しており、この問題を解決するための最良の方法を探しています。

予定表アプリケーションを書いています。さまざまなユーザーのカレンダーエントリが大きなカレンダーテーブルに保存されます。各カレンダーエントリには、リマインダーセットを設定できます。リマインダー/エントリは1つだけです。

統計的には、カレンダーテーブルは時間の経過とともに数十万のレコードに成長する可能性がありますが、リマインダーははるかに少なくなります。

定期的にリマインダーを照会する必要があります。

どちらが最良の選択肢ですか?

A)リマインダーの情報をカレンダーテーブルに保存します(この場合、IsReminder = 1について数十万のレコードをクエリします)

B)リマインダーが設定されているカレンダーエントリのIDのみを含む別のリマインダーテーブルを作成し、JOIN操作で2つのテーブルにクエリを実行します(またはそれらのビューを作成します)

C)リマインダーに関するすべての情報をリマインダーテーブルに保存してから、このテーブルのみをクエリできます。欠点は、リマインダーを表示するために、イベントの開始時刻を知ってリマインダーテーブルに保存する必要があるなど、一部の情報を両方のテーブルに複製する必要があることです。したがって、同じ値を持つ2つのテーブルを維持しています。

どう思いますか?

そしてもう1つの質問:Calendarテーブルには、UserIDフィールドのみで区切られた複数のユーザーのカレンダーが含まれます。ユーザーは4〜5人しかないため、このフィールドにインデックスを付けても、その選択性は非常に悪くなります。これは、数十万のレコードがあるテーブルには適していません。ここに回避策はありますか?

ありがとう!

4

3 に答える 3

2

3 つの選択肢すべてに長所と短所があります。どちらが最適かは、提供していない詳細によって異なります。一般に、10 万のエントリから 3 つまたは 4 つのエントリを選択することについてあまり心配する必要はありません。ただし、設定したインデックスで適切な検索戦略が可能である場合に限ります。索引付けを理解していないと、3 つの選択肢のどれを選択しても問題が発生する可能性があります。

私だったら、選択肢 B を選びます。また、リマインダーのテーブルにリマインダーの属性を保存します。

EventId のみでイベントを識別するか、(UserId, EventId) でイベントを識別するかについては十分に注意してください。後者を選択する場合は、イベント テーブルに複合主キーを使用する必要があります。特に Firebird では、複合主キーについてあまり心配する必要はありません。
複合主キーを宣言する場合、(UserId, EventId) を宣言しても、(EventId, UserId) を宣言した場合と同じ結果にはならないことに注意してください。これらは論理的には同等ですが、自動生成されるインデックスの構造は 2 つのケースで異なります。

これは、「特定のユーザーのすべてのリマインダーを検索する」などのクエリの速度に影響します。

繰り返しますが、私なら選択肢 C は避けます。スキーマに有害な冗長性を導入すると、データを更新するときに非常に注意深いプログラミングを行う責任が伴います。そうしないと、データベースの異なる場所に同じ事実の矛盾したバージョンを格納するデータベースになってしまう可能性があります。

また、パフォーマンスへの影響を本当に知りたい場合は、3 つの方法すべてを試し、テスト データを読み込んで、独自のベンチマークを実行してください。

于 2010-11-19T12:43:26.170 に答える
0

現実的な偽のユーザーデータを作成し、実行する予定の一般的なクエリとの違いを測定する必要があると思います。

インデックス作成、クエリの最適化、および必要なクエリ結果の種類は大きな違いを生む可能性があるため、詳細を知らずに何が最善かを言うのは簡単ではありません。

于 2010-11-19T12:14:42.510 に答える
0

オプション (A) を選択する場合は、次のことを行う必要があります。

  • 「IsReminder」のインデックスを提供します (または、目的のクエリに最適な IsReminder、UserId の複合インデックス)
  • クエリがこのインデックスを使用していることを確認してください

オプション B は、保存するリマインダーごとに複数のブール値フラグがある場合 (たとえば、イベントの前にユーザーに通知する分数)、A よりも適しています。ただし、プログラムで両方のテーブルを JOIN する必要がある頻度を推測する必要があります。

可能であれば、オプション C は避けてください。3 つのケースすべてをベンチマークしたくない場合は、説明されている状況に応じて、A または B から始めることをお勧めします。おそらく、選択したソリューションは十分に高速であるため、他のケースを気にする必要があります。

于 2010-11-19T14:31:42.617 に答える