1

我在不同的服务器上有两个表,我需要一些帮助来找到一种有效的方法来组合和匹配数据集。这是一个例子:

从保存我们故事的服务器 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)

现在我需要一些方法来组合这两个查询,所以我有一个包含故事以及 avatar_url 和 member_id 的字典。

如果此数据在一台服务器上,它会是一个简单的连接,如下所示:

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

您将不得不以某种方式将数据整合在一起。

  • 诸如服务器链接之类的东西(尽管这可能不是 mysql 上下文中的正确术语)可能允许跨不同数据库进行查询。这引发了另一组问题(安全性!)

  • 更简单的解决方案是将数据集中在一个数据库中。

  • 最后一个(最不理想的)解决方案是按照 Padmarag 的建议加入代码。

于 2010-05-11T05:00:34.853 回答
0

唯一的选项看起来是数据库链接,但不幸的是在 MySQL 中不可用。
您必须在应用程序代码中进行合并。最好将数据保存在同一个数据库中。

于 2010-05-11T05:06:14.580 回答
0

是否可以设置将所需表从一台服务器复制到另一台服务器的数据库?这样,您就可以将所有数据放在一台服务器上。

此外,请参阅自 mysql 5.0.3 起可用的FEDERATED存储引擎。

于 2010-05-11T10:45:02.290 回答