1

我有一个这样的数据库表,大约有 100 万行:

id    prev    curr    next
1     25      26      27
2     26      27      28
3     27      45      46
4     45      46      47
5     46      47      48
6     47      59      41
..............
..............

在 java 方面,我需要做的是,对于给定的输入,如(curr = 45 和 diff = 2),我需要获取项目列表,如 45、27、26。对于输入(curr = 59 和 diff = 1),我需要得到 59, 47 正如您在上面看到的,prev 和 next 并不总是比当前值小 1 和大 1。

目前我在java中所做的是基于差异值,我查询表来获取curr的prev。然后使用 prev 作为 curr,我再次查询表并继续,直到我得到我正在寻找的东西。但是对于 20 或 30 等更高的 diff 值,这就是太多的数据库调用。

有人对在 1 个数据库查询中完成所有这些有任何想法吗?由于表中的行太多,因此无法在本地获取和保存数据。

编辑回复评论:

  • 该表还包含其他列,因此数据不会只有 16MB。我只是剪掉了不相关的列。
  • 当前字段中没有重复项。
  • 还有其他函数使用 curr 和 next 列,类似于 prev 和 curr。
  • 这不是树结构。所以最后一行是有效行。
4

3 回答 3

1

您可以自加入表 X 次(基于 的值diff,但如果您需要支持diff.

这对我来说似乎是一个模式问题。如果没有进一步了解在写入数据库时​​如何分配项目的顺序,就很难就如何更改架构以允许更轻松的读取查询提出建议。

于 2013-02-08T16:32:21.847 回答
0

我认为你可以通过两个数据库调用来做到这一点:

SELECT id, curr, next FROM ...

这仍然应该是相对少量的数据。

从那里,使用javascript diff # of times遍历数据以找到您需要的ID。

然后:

SELECT * from ... WHERE id = {the record you need}
于 2013-02-08T18:17:12.893 回答
0

分层数据:prev of prev of prev of curr,所以 curr的prev+是关系 SQL 中缺失的操作。

您可以将 prev+ 表创建为 (curr, prevplus, level) 以便prev^level提供 prevplus。填这样一张表并不难,甚至可以做一些改变;在 mysql 中(因为自引用)有一个临时表。

然后查询将与level <= 2.

当然,表 prevplus 变大了。

于 2013-02-08T16:39:43.440 回答