1

異なるサーバーに 2 つのテーブルがあり、データセットを組み合わせて一致させる効率的な方法を見つける手助けが必要です。次に例を示します。

ストーリーを保持するサーバー 1 から、次のようなクエリを実行します。

query = """SELECT author_id, title, text
           FROM stories
           ORDER BY timestamp_created DESC
           LIMIT 10
           """
results = DB.getAll(query)

for i in range(len(results)):
    #Build a string of author_ids, e.g. '1314,4134,2624,2342'

しかし、サーバー 2 から各 author_id に関する情報を取得したいと思います。

query = """SELECT id, avatar_url
           FROM members
           WHERE id IN (%s)
           """
values = (uid_list)
results = DB.getAll(query, values)

ここで、これら 2 つのクエリを組み合わせる方法が必要なので、ストーリー、avatar_url、member_id を含む dict を作成します。

このデータが 1 つのサーバー上にある場合、次のような単純な結合になります。

SELECT *
FROM members, stories
WHERE members.id = stories.author_id

しかし、複数のサーバーにデータを保存しているため、これは不可能です。

これを行う最も効率的な方法は何ですか? 私のアプリケーション コードでマージが発生する可能性があることは理解しています... dict ループの数を最小限に抑える効率的なサンプル コードは大歓迎です!

ありがとう。

4

4 に答える 4

2

メモリに問題がなければ、辞書を使用できます。

results1_dict = dict((row[0], list(row[1:])) for row in results1)
results2_dict = dict((row[0], list(row[1:])) for row in results2)

for key, value in results2_dict:
    if key in results1_dict:
        results1_dict[key].extend(value)
    else:
        results1_dict[key] = value

これは特に効率的ではありませんが(n 2)、比較的単純であり、必要なことを正確に実行するように調整できます。

于 2010-05-11T10:25:55.140 に答える
0

あるサーバーから別のサーバーへの必要なテーブルのレプリケーションを設定することは可能ですか?そうすれば、すべてのデータを1つのサーバーに置くことができます。

また、 mysql5.0.3以降で使用可能なFEDERATEDストレージエンジンも参照してください。

于 2010-05-11T10:45:02.290 に答える
0

何らかの方法でデータをまとめる必要があります。

  • 異なる DB 間でのクエリを可能にするサーバー リンクのようなものがあります (これはおそらく mysql のコンテキストでは正しい用語ではありません)。これにより、別の問題が発生します (セキュリティ!)

  • より簡単な解決策は、データを 1 つの DB にまとめることです。

  • 最後の (最も望ましくない) 解決策は、Padmarag が提案するようにコードに参加することです。

于 2010-05-11T05:00:34.853 に答える
0

唯一のオプションは Database Link のようですが、残念ながら MySQL では利用できません。
アプリケーション コードでマージを行う必要があります。データを同じデータベースに保持することをお勧めします。

于 2010-05-11T05:06:14.580 に答える