zeuux-universe  - 讨论区

标题:[zeuux-universe] SQLite数据库通常怎么处理有序数组?

2013年11月26日 星期二 15:18

Kermit.Mei kermit.mei在gmail.com
星期二 十一月 26 15:18:25 CST 2013

Dear all,

        RT,   有一堆数据,现实给用户时这些数据是可以让用户
自己手动排序的,但是我觉得我现在处理顺序的做法很别扭:

        我在数据库的记录中多加了一列 "Order", 里面有个整型数值。
但是缺点是,每次调整某个靠前位置时,我都要把数据库中所有记录
的Order修改一遍,我觉得这是个愚蠢的做法。本身目的是修改一条记
录的位置,但是却被迫改变所有记录的数据,这个操作理论上应该是一
个"原子操作",如果数据量过大的话,会不会存在效率/体验方面的问题?

        我想这种很常见的场景应该有更聪明的方式去处理。  之前私下和一
些从事数据库开发的同学讨论过,但他们说也用的类似我的这个方法,这
让我颇为不解,所以前来讨教。

         
Thanks
B.R
Kermit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-universe]

2013年11月26日 星期二 16:10

YS.Zou yeshengzou在gmail.com
星期二 十一月 26 16:10:28 CST 2013

On 11-26 15:18, Kermit.Mei wrote:
>Dear all,
>  RT, 有一堆数据,现实给用户时这些数据是可以让用户
>自己手动排序的,但是我觉得我现在处理顺序的做法很别扭:
>  我在数据库的记录中多加了一列 "Order", 里面有个整型数值。
>但是缺点是,每次调整某个靠前位置时,我都要把数据库中所有记录
>的Order修改一遍,我觉得这是个愚蠢的做法。本身目的是修改一条记
>录的位置,但是却被迫改变所有记录的数据,这个操作理论上应该是一
>个"原子操作",如果数据量过大的话,会不会存在效率/体验方面的问题?
>  我想这种很常见的场景应该有更聪明的方式去处理。  之前私下和一
>些从事数据库开发的同学讨论过,但他们说也用的类似我的这个方法,这
>让我颇为不解,所以前来讨教。


写的时候麻烦了一些, 但是读的时候这种方式不是很方便么, 直接一个 `order by` 就解决问题.

这种有序的结构也可以像"链表"那样, 在关系数据库中存 ``before / after`` , 这样改和删都很方便, 但是读的时候就麻烦了.

效率问题上, 在实际中这种情况应该不会发生, 因为业务上你要做的是"手动排序", 如果条目过多做不了"手动".

如果说"手动排序"只是一种补充方案, 那这里的 //Order// 可以理解成是一种"权重"的概念, 允许它重复就可以少"改"的麻烦.





--
进出自由才是游戏者的生存之道。

http://zouyesheng.com
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: <http://www.zeuux.org/pipermail/zeuux-universe/attachments/20131126/fa306dd0/attachment.html>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-universe]

2013年11月26日 星期二 16:25

Kermit.Mei kermit.mei在gmail.com
星期二 十一月 26 16:25:41 CST 2013

嗯,Order在这里确实就是个权重的概念。
看您的回复,貌似大家确实都是这么用的。

我后面又想了一下解决方案来避免每次修改所有数据:

这个Order权重 存放的不是一个整数,而是一个浮点数,
对于初始化数据,每个数据的间隔都是1,但是移动的时
候,采用叠加小数的权重,比如:
原始数据:
(data1,  1), (data2,  2), (data3,  3), (data4,  4), (data5,  5)
把data2 移动到 4和5之间:
(data1,  1), (data2,  4.1), (data3,  3), (data4,  4), (data5,  5)

如果0.1用完了,就用 0.01,依次类推,这样就永远只需改变 
需要移动的那个item的order值即可。


不过,不是很自信的是,这种方式会不会造成order by在效率
等方面产生问题?

B.R
Kermit

> 在 2013年11月26日,下午4:10,"YS.Zou" <yeshengzou在gmail.com> 写道:
> 
> On 11-26 15:18, Kermit.Mei wrote:
> 
>  Dear all,
>   RT, 有一堆数据,现实给用户时这些数据是可以让用户
>  自己手动排序的,但是我觉得我现在处理顺序的做法很别扭:
>   我在数据库的记录中多加了一列 "Order", 里面有个整型数值。
>  但是缺点是,每次调整某个靠前位置时,我都要把数据库中所有记录
>  的Order修改一遍,我觉得这是个愚蠢的做法。本身目的是修改一条记
>  录的位置,但是却被迫改变所有记录的数据,这个操作理论上应该是一
>  个"原子操作",如果数据量过大的话,会不会存在效率/体验方面的问题?
>   我想这种很常见的场景应该有更聪明的方式去处理。  之前私下和一
>  些从事数据库开发的同学讨论过,但他们说也用的类似我的这个方法,这
>  让我颇为不解,所以前来讨教。
> 写的时候麻烦了一些, 但是读的时候这种方式不是很方便么, 直接一个 `order by` 就解决问题.
> 
> 这种有序的结构也可以像"链表"那样, 在关系数据库中存 before / after , 这样改和删都很方便, 但是读的时候就麻烦了.
> 
> 效率问题上, 在实际中这种情况应该不会发生, 因为业务上你要做的是"手动排序", 如果条目过多做不了"手动".
> 
> 如果说"手动排序"只是一种补充方案, 那这里的 Order 可以理解成是一种"权重"的概念, 允许它重复就可以少"改"的麻烦.
> 
> -- 
> 进出自由才是游戏者的生存之道。
> 
> http://zouyesheng.com
> 
> _______________________________________________
> zeuux-universe mailing list
> zeuux-universe在zeuux.org
> http://www.zeuux.org/mailman/listinfo/zeuux-universe
> 
> ZEUUX Project - Free Software, Free Society!
> http://www.zeuux.org
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: <http://www.zeuux.org/pipermail/zeuux-universe/attachments/20131126/0a65c39e/attachment.html>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-universe]

2013年11月26日 星期二 16:50

YS.Zou yeshengzou在gmail.com
星期二 十一月 26 16:50:24 CST 2013

On 11-26 16:25, Kermit.Mei wrote:
>嗯,Order在这里确实就是个权重的概念。
>看您的回复,貌似大家确实都是这么用的。
>
>我后面又想了一下解决方案来避免每次修改所有数据:
>
>这个Order权重 存放的不是一个整数,而是一个浮点数,
>对于初始化数据,每个数据的间隔都是1,但是移动的时
>候,采用叠加小数的权重,比如:
>原始数据:
>(data1,  1), (data2,  2), (data3,  3), (data4,  4), (data5,  5)
>把data2 移动到 4和5之间:
>(data1,  1), (data2,  4.1), (data3,  3), (data4,  4), (data5,  5)
>
>如果0.1用完了,就用 0.01,依次类推,这样就永远只需改变 
>需要移动的那个item的order值即可。
>
>不过,不是很自信的是,这种方式会不会造成order by在效率
>等方面产生问题?


先不管效率层面的考虑, 在代码实现和执行控制上都是得不偿失的. 浮点数的精度不可能永远满足排序要求的.

之前的移动, 只涉及两条 SQL 语句:

```sql
update xx set `order` = `order` + 1 where `order` > a;
update xx set `order` = a;
```

整个过程是可控的.

而这个小数方案, 随着移动行为的不断发生, 你的数据是一种无法控制的"蔓延"状态.




--
进出自由才是游戏者的生存之道。

http://zouyesheng.com
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: <http://www.zeuux.org/pipermail/zeuux-universe/attachments/20131126/e18c6a28/attachment-0001.html>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-universe]

2013年11月26日 星期二 17:00

Kermit.Mei kermit.mei在gmail.com
星期二 十一月 26 17:00:51 CST 2013

> 在 2013年11月26日,下午4:50,"YS.Zou" <yeshengzou在gmail.com> 写道:
> 
> On 11-26 16:25, Kermit.Mei wrote:
> 
>  嗯,Order在这里确实就是个权重的概念。
>  看您的回复,貌似大家确实都是这么用的。
>  
>  我后面又想了一下解决方案来避免每次修改所有数据:
>  
>  这个Order权重 存放的不是一个整数,而是一个浮点数,
>  对于初始化数据,每个数据的间隔都是1,但是移动的时
>  候,采用叠加小数的权重,比如:
>  原始数据:
>  (data1,  1), (data2,  2), (data3,  3), (data4,  4), (data5,  5)
>  把data2 移动到 4和5之间:
>  (data1,  1), (data2,  4.1), (data3,  3), (data4,  4), (data5,  5)
>  
>  如果0.1用完了,就用 0.01,依次类推,这样就永远只需改变 
>  需要移动的那个item的order值即可。
>  
>  不过,不是很自信的是,这种方式会不会造成order by在效率
>  等方面产生问题?
> 先不管效率层面的考虑, 在代码实现和执行控制上都是得不偿失的. 浮点数的精度不可能永远满足排序要求的.
> 

嗯,应该是我想多了。  我是想当检测到浮点越界的时候,再执行一步你下面这个操作
作为补充。 不过代码实现上,如果全部用SQL来写,确实有点儿得不偿失。


> 之前的移动, 只涉及两条 SQL 语句:
> 
>   update xx set `order` = `order` + 1 where `order` > a;
>   update xx set `order` = a;
> 整个过程是可控的.
> 
> 而这个小数方案, 随着移动行为的不断发生, 你的数据是一种无法控制的"蔓延"状态.
> 
> -- 
> 进出自由才是游戏者的生存之道。
> 
> http://zouyesheng.com
> 
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: <http://www.zeuux.org/pipermail/zeuux-universe/attachments/20131126/36dae9cf/attachment.html>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-universe]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号