У меня есть две таблицы на различных серверах, и я хотел бы некоторую справку, находящую эффективный способ объединить и соответствовать наборам данных. Вот пример:
С сервера 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 циклов, значительно ценился бы!
Спасибо.
Если память не проблема, можно использовать словарь.
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), но относительно просто, и вы можете настроить его так, чтобы он делал именно то, что вам нужно.
Вам нужно будет каким-то образом свести данные воедино.
Существуют такие вещи, как ссылки на сервер (хотя это, вероятно, неправильный термин в контексте mysql), которые могут разрешать запросы к разным БД. Это создает еще один набор проблем (безопасность!)
Более простое решение - объединить данные в одной БД.
Последнее (наименее желательное) решение - присоединиться к коду, как предлагает Падмараг.
Единственным вариантом выглядит ссылка на базу данных, но, к сожалению, он недоступен в MySQL.
Вам нужно будет выполнить слияние в коде приложения. Лучше хранить данные в одной базе данных.
Возможно ли настроить репликацию нужных таблиц с одного сервера в базу данных на другом? Таким образом, вы могли бы иметь все данные на одном сервере.
Также смотрите FEDERATED механизм хранения данных, доступный начиная с mysql 5.0.3.