2017-06-11 42 views
0

假设我们有3个表,Customer,Subscription, Newspaper,其中Subscription是另外两个之间的关系。如果我们想要某个人订阅的报纸名称,我们可以进行查询以获取所有Subscriptions的列表,生成一个名为allSubscription的数组,然后在RAM中搜索包含客户ID的元组并检索报纸列表IDS。有了这些,我们可以得到所有报纸名字的列表,查询整个Newspaper表,获得allNewspaper数组,并在RAM中搜索包含我们知道该人订阅的ID的元组。这种方法是对连接的模拟,但没有连接。RAM查询vs加入

我们很早就知道数据库针对这种查询进行了优化,我们不应该使用这种方法。但是,对于每个客户我们需要这种名称的情况呢?

在这种情况下,传统查询将连接3个表。但是,如果我们使用刚描述的RAM搜索,我们将有3个数组,allCustomers,allSubscriptions,allNewspaper,其中似乎总共比查询三个表的连接更便宜。最后,我们从结果一些维权,比如,说:

ramSubs = {} 
for c in allCustomers: 
    ramSubs[c.id] = [] 
for s in allSubscriptions: 
    ramSubs[s.customer_id].append(s.newspaper_id) 
ramNews = {}  
for n in allNewspaper: 
    ramNews[n.id] = n.name 
for c in allCustomers: 
    print c.name 
    for c_id,n_id in ramSubs: 
     print ramNews[n_id], 

随着中说,这得谏和高效?

+0

这不是SQL - 那为什么是SQL标记? –

+0

我的数据库比你的RAM大。它也更快,主要是因为它不需要获取所有记录。 – wildplasser

回答

0

你所描述的是一个嵌套循环连接。所有数据库都必须实现嵌套循环连接以及其他各种方法。

如果你有三个“表”,那么大概这些都存储在一个SQL引擎中。最好的方法是让SQL引擎处理数据,为其确定最佳算法。

如果你有内存中的三个数组的数据,那么你不是在谈论一个SQL引擎。你只是在谈论实现一个高效的算法 - 数据库设计师一直关注的问题。 (也就是说,针对已知数据结构的定制算法针对运行该系统的系统进行了优化,可能会比在数据库中运行的系统更快)。

+0

也许我没有清楚。是的,他们是SQL表,我没有他们作为RAM阵列,但我可以得到这样的数组与三个“小”的查询,而不是一个嵌套连接。 –