2017-06-11 15 views
0

CustomerSubscriptionNewspaperここで、Subscriptionは他の2つの間の関係です。特定の個人が購読している新聞の名前が必要な場合は、allSubscriptionと呼ばれる配列を作成し、顧客のIDを含むタプルをRAMで検索し、新聞のリストを取得するクエリをすべてSubscriptionsのリストに取得する必要がありますids。これにより、Newspaperテーブル全体を検索し、allNewspaperという配列を取得するすべての新聞の名前のリストを取得し、RAMに登録されているIDを含むタプルをRAMで検索することができます。このメソッドは結合のシミュレーションですが、結合はありません。RAMクエリvs参加

データベースは、このようなクエリに対して最適化されていることを非常に早く学びます。この方法は使用しないでください。しかし、すべてのお客様にこのような名前が必要な場合はどうですか?

この場合、tradionalクエリは3つのテーブルを結合します。しかし、今説明したRAM検索を使用すると、3つの配列allCustomers,allSubscriptions,allNewspaperがあり、3つのテーブルの結合をクエンチするよりも安価であるようです。最後に、我々はいくつかのFORSからの結果を持っている、のような、言う:それに

ramSubs = {} 
for c in allCustomers: 
    ramSubs[c.id] = [] 
for s in allSubscriptions: 
    ramSubs[s.customer_id].append(s.newspaper_id) 
ramNews = {}  
for n in allNewspaper: 
    ramNews[n.id] = n.name 
for c in allCustomers: 
    print c.name 
    for c_id,n_id in ramSubs: 
     print ramNews[n_id], 

は、よりadvicedかつ効率的であるアプローチ、言いましたか?

+0

これはSQLではないので、なぜSQLタグですか? –

+0

私のデータベースはあなたのRAMより大きいです。また、すべてのレコードを*フェッチする必要がないため、高速です。 – wildplasser

答えて

0

あなたが説明しているのは、ネストループジョインです。ネストされたループ結合を実装するすべてのデータベースと、さまざまな方法があります。

「テーブル」が3つある場合、これらはおそらくSQLエンジンに格納されます。最良の方法は、SQLエンジンにデータを処理させ、そのための最適なアルゴリズムを特定することです。

メモリ内に3つの配列のデータがある場合、SQLエンジンについては言及していません。あなたは、効率的なアルゴリズムの実装について話しています。データベース設計者がこれまでに心配してきたことです。 (つまり、既知のデータ構造の特注アルゴリズムは、実行中のシステムがデータベース内で実行されているものよりも高速である可能性が高いため最適化します)。

+0

多分私は自分自身を明らかにしませんでした。はい、彼らはSQLテーブルですが、私はそれらをram配列として持っていませんが、3つの "小さな"クエリを1つのネストされた結合ではなく、そのような配列を得ることができます。 –