私はこのようになり、深い階層モデルを持っている:最適化階層問合せ
は アカウント - >イベント - - >チケット
そして、私は、クエリを実行する必要がある - >ゲストが を示しています>が を会場
クエリ:
それは次のようになりますので、私は、親のゲストリストやイベントや会場ORアカウントに基づいてチケットを選択する場所select * from user_detail ud, venue v, event e, guest_list g, ticket t
where
t.guest_list = g.id
and g.event = e.id
and e.venue = v.id
and (
ud.guest_list = t.guest_list
or ud.event = g.event
or ud.venue = e.venue
or ud.account = v.account
)
これはもちろん非常にコストのかかるクエリです。私は何百万というチケットを持っているので、これは私が望んでいたようにうまく動作していません。
非理想的なソリューション(チケットレベルで冗長親への参照を格納)
私は考えています解決策は、チケット行の直接の親が、すべての超両親だけでなく格納することで、これを最適化することで、だから、ゲストリストテーブルを参照するのではなく、すべてのチケットの親イベント、会場、アカウントを参照することになります。 これは達成するのは非常に簡単ですが、これは私が冗長なデータを保存し、親を変えることは面倒でエラーが起こりやすいことを意味します。
理想的なソリューション(つまり、冗長データを必要としないものは何でも)ここ
任意の提案ですか?
本当にこれらのテーブルのすべての列を選択する必要がありますか?そうでなければ、どのテーブルを実際に選択する必要がありますか? – ruakh
私はuser_detailテーブルから選択する必要がありますが、私はこの階層トラバーサルを行うために他のものに参加する必要がありますか? –
また、ANSI SQL JOIN構文の学習に少し時間を費やしても、長期的には大きな配当を支払うことになります! – ninesided