ORM 或其他东西可以有效地处理带有 order 列的 SQL 表

Posted

技术标签:

【中文标题】ORM 或其他东西可以有效地处理带有 order 列的 SQL 表【英文标题】:ORM or something to handle SQL tables with an order column efficiently 【发布时间】:2009-01-30 12:38:59 【问题描述】:

我有一个使用 SQL 表的 Java 应用程序,其中包含按顺序排列的实体列表 一个订单列。我想在中间/从中间添加/删除东西 的名单。现在,我想知道是否有一些持久性框架/orm/you-name-it 可以通过批量更新订单来提供这种功能 柱子。

在基本情况下,Hibernate(可能还有其他)提供这个 功能。 问题是对象一次只处理一个,这就变成了 当列表足够大时出现问题。替代解决方案是 使用批量 SQL 更新来做这件事,例如:

UPDATE table SET order_col = order_col + 1 WHERE order_col > 47
INSERT TO table VALUES ('new_id', 'new_description, ..., 47)

这由数据库引擎很快完成,但不受支持。

现在,我明白了 在考虑对象及其对象时,那种批量更新不太适合 版本控制,脏检查等。 我仍然会问是否有人有一些好主意,或者是否有一些坚持 framework / ORM / you-name-it 会提供一些帮助。 当然我可以用自定义 SQL/HQL/... 但想知道 如果已经有一些解决方案(我认为其他人可以 以前做过类似的事情,甚至把它放在开源下)。也欢迎其他与该问题相关的好主意=)

【问题讨论】:

【参考方案1】:

我的建议是做两件事:

    在您的项目之间选择非常大的增量,例如一百万。这样,您可以将 8,000,000 的项目移动到 7,000,000 之前,只需将其更改为 6,500,000;和 不时地将项目重新排序为批处理作业。

大增量并不能消除进行大量重新订购的问题,但需要进行大量重新订购的可能性极小,并且批处理作业可以根据需要每天/每周/每月重新订购一次。

一次换一大堆东西简直是乱七八糟的自找麻烦。

【讨论】:

我的系统设置是这样的,但我正在考虑一种稍微不同的方法。我不是每晚都运行批处理作业,而是在发生冲突时触发批处理升级。因此,如果用户设法以最终导致冲突的方式确定数据的优先级,则它会触发稍长的更新。【参考方案2】:

如果你真的想以连续的顺序结束,你可以这样做:

首先,将sortorder 乘以 1000

UPDATE testtable SET sortorder = sortorder * 1000

现在进行插入并插入合适的sortorder 值,以便将新条目放在正确的位置。

现在使用ROW_NUMBER 函数更新表并更新值

UPDATE testtable
SET sortorder = subq.newsortorder
FROM
  (
  SELECT
    ID as innerID,
    ROW_NUMBER() OVER(ORDER BY sortorder ASC) as newsortorder
  FROM testtable
  ) subq
WHERE subq.innerID = ID

ID 被选为innerID,因为更新后的表不能使用别名,否则 ID 列会不明确。

这是在按sortorder 排序时使用行号更新sortorder

【讨论】:

以上是关于ORM 或其他东西可以有效地处理带有 order 列的 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to XML、ORM 或“完全不同”的东西?

在 Web 应用程序中有效地处理不同的时区

寻找特定的 python ORM

确定字符串输入是不是可以是 Python 中的有效目录

如何用数组(或任何其他支持加法以便它可以偏移的东西)干净地索引numpy数组[重复]

为啥我不能在其他类或函数中使用我的 Propel ORM 类?