Эффективный способ объединить результаты двух запросов базы данных

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

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

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

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

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

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

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

Спасибо.

1
задан ensnare 11 May 2010 в 05:22
поделиться

4 ответа

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

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

Это не особенно эффективно (n2), но относительно просто, и вы можете настроить его так, чтобы он делал именно то, что вам нужно.

2
ответ дан 3 September 2019 в 00:40
поделиться

Вам нужно будет каким-то образом свести данные воедино.

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

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

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

0
ответ дан 3 September 2019 в 00:40
поделиться

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

0
ответ дан 3 September 2019 в 00:40
поделиться

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

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

0
ответ дан 3 September 2019 в 00:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: