【发布时间】:2022-01-23 07:38:15
【问题描述】:
我正在学习有关关系数据查询处理的 join algorithms。最简单的情况是嵌套循环连接:
function nestedJoin(R, S, compare) {
const out = []
for (const r of R) {
for (const s of S) {
if (compare(r, s)) {
out.push([ r, s ])
}
}
}
return out
}
compare 将比较 join 属性。
我想知道的情况是索引连接。从该备忘单复制到 JS 中,我们有:
function indexJoin(R, S) {
const out = []
for (const r of R) {
const X = findInIndex(S.C, r.c)
for (const s of X) {
out.push([ r, s ])
}
}
return out
}
但是findInIndex(S.C, r.c) 是什么?传递给它的是什么 (S.C)?它是如何工作的?
join indices paper 是这样说的:
没有索引,两种基于排序 [4] 和散列的基本算法 [5, lo] 避免嵌套循环方法的高昂成本。
连接索引是一种二元关系。它只包含成对的代理,这使得 (它很小。但是,为了一般性,我们假设它并不总是适合 RAM。 因此,连接索引必须是聚集的。因为我们可能需要快速访问 JI 元组通过 r 值或 s 值取决于是否有选择 关系 R 或 S,一个 JI 应该聚集在 (r, s) 上。一个简单而统一的解决方案 是维护JI的两个副本,一个集群在r上,另一个集群在 s。每个副本都由 W-tree 实现,这是通用的有效变体 B-树 [l, 71.
那么如果它是一个 B+tree,那么每个 B+tree 中会使用什么键和值,以及如何使用键和值(插入键和获取值的顺序是什么)?另外,如果“连接索引”是在 JavaScript 中,就不能像这样实现吗?
const joinIndex = {}
function join(r, s) {
const rest = joinIndex[r.c] = joinIndex[r.c] ?? {}
rest[s.c] = true
}
function findInIndex(leftKey) {
return Object.keys(joinIndex[leftKey])
}
请说明如何使用我的方法或 B+tree 方法来实现连接算法。如果是 B+tree 方法,则不需要实现 B+tree,只需说明如何将事物插入/取出 2 个 B+tree,以便更清楚地解释算法。
【问题讨论】:
标签: javascript database indexing data-structures b-tree