如何在数据库中有效维护排序顺序

时间:2015-03-25 05:33:01

标签: database oracle oracle11g

特定供应商的产品排序顺序存储在表格中。

例如:

ITEM_ID SORT_ORDER
100         1
101         2
105         3
106         4
108         5

依旧......

现在,如果供应商希望在他的网页上显示第一个产品(100),他可以在他的网页上显示第一个产品(100),为了显示他想要的结果,我们需要在表格中更改排序值,如下所示。

所有项目的新排序顺序值都会更新,新表格的格式如下:

ITEM_ID SORT_ORDER
100         5
101         1
105         2
106         3
108         4

依旧......

据观察,为了改变1个产品的排序顺序,我们必须为该特定供应商更新该表的所有行。 这是一项昂贵的工作。

我们正在寻找这个问题的解决方案,该解决方案使该供应商的产品的排序顺序保持最优化和最优化。成本效益的方法。

以任何其他方式维护排序顺序的任何替代解决方案

3 个答案:

答案 0 :(得分:2)

  

据观察,为了改变1个产品的排序顺序,我们必须为该特定供应商更新该表的所有行。这是一项昂贵的工作。

嗯,是的,您需要更新所有行,但是,只需两步即可完成。在纯SQL中使用两个UPDATE语句

测试用例:

SQL> CREATE TABLE t
  2      (ITEM_ID int, SORT_ORDER int);

Table created.

SQL>
SQL> INSERT ALL
  2      INTO t (ITEM_ID, SORT_ORDER)
  3           VALUES (100, 1)
  4      INTO t (ITEM_ID, SORT_ORDER)
  5           VALUES (101, 2)
  6      INTO t (ITEM_ID, SORT_ORDER)
  7           VALUES (105, 3)
  8      INTO t (ITEM_ID, SORT_ORDER)
  9           VALUES (106, 4)
 10      INTO t (ITEM_ID, SORT_ORDER)
 11           VALUES (108, 5)
 12  SELECT * FROM dual;

5 rows created.

SQL>
SQL> COMMIT;

Commit complete.

SQL>

现在,第一次更新 ITEM_ID 100 将其设置为 SORT_ORDER 5

SQL> UPDATE t SET sort_order = 5 WHERE item_id = 100;

1 row updated.

SQL> SELECT * FROM t;

   ITEM_ID SORT_ORDER
---------- ----------
       100          5
       101          2
       105          3
       106          4
       108          5

SQL>

现在,第二次更新适用于所有 other ITEM_IDs ,将其设置为 SORT_ORDER -1

SQL> UPDATE t SET sort_order = sort_order - 1
  2  WHERE item_id <> 100;

4 rows updated.

SQL>
SQL> SELECT * FROM t;

   ITEM_ID SORT_ORDER
---------- ----------
       100          5
       101          1
       105          2
       106          3
       108          4

SQL>

因此,只需两个更新语句即可完成任务。

更新根据Jeffrey的评论,可以使用 CASE 语句在单个更新语句中完成。

例如,

UPDATE t
SET    sort_order = CASE item_id
                      WHEN 100 THEN 5
                      ELSE sort_order - 1
                    END;  

如果sort_order列上有任何唯一约束,那么与我之前使用两个更新语句的演示相比,这种方法更好。

答案 1 :(得分:1)

更好的解决方案是给出它们之间有很大差异的值,然后我们只需要更新一个值 例如

ID SORT_ORDER 100 500 102 1000 103 1500 104 2000 如果我们改变订单,我们只需要更新一行

ID SORT_ORDER 104 250 100 500 102 1000 103 1500

但我们需要跟踪有效操作可以执行的次数,如果找不到更多可能性,则需要重置数据。

答案 2 :(得分:0)

据观察,为了更改1个产品的排序顺序,我们必须为该特定供应商更新此表的所有行。这是一项代价高昂的练习。

您可以对前端进程中的所有项进行排序,并按排序顺序排列所有逗号分隔的ITEM_ID,并将其保存在数据库中(使用Primary Key)在单个UPDATE语句中。