2010-05-11 198 views
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循环的数量,我们将不胜感激!

谢谢。

回答

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 ),但它是相对简单的,你可以调整它做的正是你所需要的。

0

您必须以某种方式将数据集中在一起。

  • 有一些像服务器链接(尽管这可能不是在mysql上下文中正确的术语),可能允许查询跨不同的数据库。这会产生另一组问题(安全!)

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

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

0

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

+0

嗨 - 我同意,我必须在我的应用程序代码中执行此操作。我正在寻找在我的应用程序中最有效的方式。任何示例代码将不胜感激。 – ensnare 2010-05-11 05:21:29

+0

在您的代码中执行此操作意味着您需要通过将组合数据写入第三个数据结构(例如字典)来比较结果集条目。这是非常具体的领域,你主要靠你自己担心。 – lexu 2010-05-11 05:29:37

0

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

另外,请参阅FEDERATED存储引擎,可用于mysql 5.0.3。