java - 如何有效地应用数据库中巨大列表的多个位置变化?

标签 java sql algorithm collections delta

我有一个巨大的简单对象的 java 列表,存储在数据库中,通过索引列维护元素的位置。我使用 hibernate 但自己管理列表,因为它太大而无法作为集合存储。

在对列表进行一些更改(添加、删除、移动)后,我想通过手动更新索引列并插入新的分别通过 hibernate 删除元素来将更改保存在数据库中。

现在,(1) 是否有一种有效的算法如何将列表增量组合为尽可能少的 sql 语句 - 或者 (2) 我是否必须记录每个更改并逐步应用它?

最佳答案

您可以尝试为巨大列表的片段维护索引更改。例如,在包含 1000 个项目的列表中,如果您:

  • 在位置 99 和 199 插入新项目,
  • 将项目 2 移动到位置 6,
  • 并删除第 277 项,

您可以使用 HQL 执行以下操作:

  • 删除项目 277
  • 更新项目集索引 = 6,其中索引 = 2
  • 更新项目集索引 = index-1,其中索引在 3 到 6 之间(并且它不是之前的项目 - 注意重叠)
  • 更新项目集索引 = 索引+1 其中索引在 278 和 1000 之间
  • 更新项目集索引 = 索引+2 其中索引在 199 和 276 之间
  • 更新项目集索引 = 索引+1 其中索引在 99 和 198 之间
  • 插入项目 99 和 200

我还没准备好研究算法的细节,只是说你需要维护一个集合段列表和每个段的偏移量。

关于java - 如何有效地应用数据库中巨大列表的多个位置变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4872641/

相关文章:

java - for循环中的if语句只返回true一次?

algorithm - 具有 2 个变量的大 O 表示法。给定 m <= n,我们可以减少 O(nm) 吗?

python - 如何在 python 中修复这个快速排序分区? (处理 Numpy 数组)

java - 在 Eclipse Indigo 上安装新的 Glassfish 服务器

java - 如果类中存在禁用测试,则不会调用 TestNg @afterclass

java - 如何使用 DecimalFormat 将表示百分比、货币的数值转换为字符串并返回 BigDecimal

c# - 尝试通过 C# 在数据库上进行选择时出现 IndexOutOfRangeException

c# - 如果找不到我输入的记录,如何在 SQL 中找到下一个更大的可用记录

php - 访客计数器的MYSQL数据库表结构

javascript - 当要选择的元素不连续时,从数组中提取元素的选择