Эффективный способ объединить результаты двух запросов к базе данных - PullRequest
1 голос
/ 11 мая 2010

У меня две таблицы на разных серверах, и мне нужна помощь в поиске эффективного способа объединения и сопоставления наборов данных. Вот пример:

С сервера 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'

Но я хотел бы получить некоторую информацию о каждом author_id с сервера 2:

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

Теперь мне нужен какой-то способ объединить эти два запроса, чтобы у меня был дикт, содержащий историю, а также avatar_url и member_id.

Если бы эти данные были на одном сервере, это было бы простое объединение, которое выглядело бы так:

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

Но поскольку мы храним данные на нескольких серверах, это невозможно.

Какой самый эффективный способ сделать это? Я понимаю, что слияние, вероятно, должно произойти в моем коде приложения ... любой эффективный пример кода, который минимизирует количество циклов dict, будет очень полезен!

Спасибо.

Ответы [ 4 ]

2 голосов
/ 11 мая 2010

Если память не проблема, вы можете использовать словарь.

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 ), но это относительно просто, и вы можете настроить его, чтобы сделать именно то, что вам нужно.

0 голосов
/ 11 мая 2010

Можно ли настроить репликацию необходимых таблиц с одного сервера в базу данных на другом? Таким образом, вы можете хранить все свои данные на одном сервере.

Также см. FEDERATED механизм хранения, доступный с mysql 5.0.3.

0 голосов
/ 11 мая 2010

Единственным вариантом выглядит ссылка на базу данных, но, к сожалению, она недоступна в MySQL.
Вам придется выполнить слияние в коде приложения. Лучше хранить данные в одной базе данных.

0 голосов
/ 11 мая 2010

Вам придется каким-то образом объединить данные.

  • Существуют такие вещи, как ссылки на серверы (хотя это, возможно, не правильный термин в контексте mysql), которые могут разрешать запросы к различным БД. Это открывает еще один набор проблем (безопасность!)

  • Более простое решение - объединить данные в одну БД.

  • Последнее (наименее желательное) решение - присоединиться к коду, как предлагает Падмараг.

...