データベースのデザインの問いるのベストソリューション?
-
26-09-2019 - |
質問
を使用していFirebird2.1んの最良の方法。
書いるカレンダーの設置ます。異なるユーザーのカレンダー作品の収納に大きなカレンダー。カレンダー毎に入力でリマインダ設定のみならず、リマインダ/entryです。
統計的には、カレンダーテーブルが成長すると数十万人の記録には時間があるかに少ない注意事項.
い場合、注意喚起います。
する最良のオプションか?
A)の注意喚起'詳細情報をカレンダー表し(この場合は私のクエリ数十万人の記録のためのIsReminder=1)
B)を作り分注意喚起の表を含み、IDカレンダーの作する注意喚起、そしてクエリのテーブルJOIN(かを示していないことを
C)付きのお店すべてに関する情報注意事項は、マテーブル、クエリーのみです。の下振れは、一部の情報が必要と重複しても、テーブルのようにするためのリマインダんを知る必要があり、店舗のイベントのstarttimeの注意喚起表-てん維持つテーブルと同じ値です。
いかがですか?
が切り替わりますので、質問:カレンダーのテーブルが含まれまでのカレンダーの複数のユーザー分のみによるユーザidます。あり得ないことから、み4-5ユーザーの場合でも、たいのは、インデックスは、この分野はその選択性は非常に悪いのは良くないテーブルの何十万人も記録しています。が回避策。
よろしく!
解決
すべての3つの選択肢の利点と欠点があります。 Whis 1が最高であることは、あなたが提供していない詳細に依存します。一般的には、10万のうちの3または4つのエントリを選択するについてはあまり心配しないでくださいあなたが右の検索戦略を許可する設定したインデックスを提供します。インデックス作成を理解していない場合は、トラブルにあなたが作る3通の選択肢の関係なくなる可能性が高いです。
それは私だったらは、私はまた、リマインダのためのテーブルにリマインダーのいずれかの属性を格納したい選択肢Bで行くだろう。
あなただけのEventIdによって、または(ユーザーIDでEventId)でイベントを識別するかどうかについて非常に注意してください。あなたは後者を選択した場合、それは、イベント・テーブルのための複合主キーを使用することができ不可欠な時代。特に火の鳥で、複合主キーについてはあまり心配しないでください。
あなたは複合主キーを宣言すると、宣言として宣言(ユーザーIDでEventId)と同じ結果を持っていないことに注意してください(でEventId、ユーザーID)。彼らは論理的に等価ですが、自動的に生成されたインデックスの構造は、2つのケースで異なるものになります。
これは、順番に、「与えられたユーザーのすべてのリマインダーを見つける」のようなクエリの速度に影響を与えます。
は、それが私だったらもう一度、私は選択肢C.にスキーマに有害な冗長性の導入を避けるだろう、それであなたがデータを更新するために行くいくつかの非常に慎重なプログラミングのための責任を運びます。そうしないと、データベースの別の場所で同じ事実の店舗矛盾したバージョン、そのデータベースに終わることができます。
そして、あなたが本当にperfromanceへの影響を知りたい場合は、テストデータを持つすべての3つの方法で、負荷を試してみてください、そしてあなた自身のベンチマークを行います。
他のヒント
私はあなたが現実的な、偽のユーザーデータを作成し、実行することを期待いくつかの典型的なクエリとの差を測定する必要があると思う。
インデックス作成、クエリの最適化とあなたは大きな違いを生むことができますする必要がクエリ結果の種類、 それは、より知らなくても、最善のものを言うことは容易ではありません。
を選択する際のオプション(A)すべ
- 提供するインデックス"IsReminder"(または複合インデックスIsReminderユーザ名もズベスト意のクエリ)
- 必ずお問合せ利用プラグインベースのアーキテクチ
オプションBが好ましく過ごしている全てのboolean flag毎にリマインダをストア(例えば、数分のユーザーは、通知される前に設けています。また、以下のようなことが推測からのプログラムのご参加もます。
できれば避けるオプションCだいたいベンチマークすべての例であることを開始、またはBに記載状況は、おそらく、解決を選択する速度でなくて邪魔にある。