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 表的主要内容,如果未能解决你的问题,请参考以下文章