当前位置:  开发笔记 > 编程语言 > 正文

在保持订购的同时将有序列表保存到数据库的最佳方法

如何解决《在保持订购的同时将有序列表保存到数据库的最佳方法》经验,为你挑选了5个好方法。

我想知道是否有人能够很好地解决我在过去几年遇到过的问题.

我有一个购物车,我的客户明确要求它的订单很重要.所以我需要将订单持久保存到DB.

显而易见的方法是简单地插入一些OrderField,我将数字0分配给N并以这种方式对其进行排序.

但这样做会使重新排序变得更加困难,我不知何故觉得这个解决方案有点脆弱,有一天会回到我身边.

(我在NHibernate和SQL Server 2005中使用C#3,5)

谢谢



1> Kickaha..:

好的,这是我的解决方案,使这个线程发生的任何人都可以更容易地编程.诀窍是能够在一次更新中更新插入/删除之上或之下的所有订单索引.

使用表中的数字(整数)列,由SQL查询支持

CREATE TABLE myitems (Myitem TEXT, id INTEGER PRIMARY KEY, orderindex NUMERIC);

要在orderindex 6中删除项目:

DELETE FROM myitems WHERE orderindex=6;    
UPDATE myitems SET orderindex = (orderindex - 1) WHERE orderindex > 6;

交换两个项目(4和7):

UPDATE myitems SET orderindex = 0 WHERE orderindex = 4;
UPDATE myitems SET orderindex = 4 WHERE orderindex = 7;
UPDATE myitems SET orderindex = 7 WHERE orderindex = 0;

即不使用0,因此使用它作为假人以避免出现含糊不清的项目.

要插入3:

 UPDATE myitems SET orderindex = (orderindex + 1) WHERE orderindex > 2;
 INSERT INTO myitems (Myitem,orderindex) values ("MytxtitemHere",3)



2> 小智..:

最佳解决方案是双向链接列表.O(1)用于除索引之外的所有操作.除了你想要的项目的where子句之外,没有什么能快速索引SQL.

0,10,20种类型失败.序列列失败.组移动时浮动序列列失败.

双向链接列表与添加,删除,组删除,组添加,组移动相同.单链表也可以.在我看来,双链接更好用SQL.单链表要求您拥有整个列表.


获得前50个项目的最佳方法是什么?我需要逐个阅读它们,还是有任何神奇的SQL解决方案?
这是恕我直言的最佳解决方案.例如,我的Netflix队列中有超过300部电影.如果我将项目从位置297移动到顶部,netflix将不必进行300次更新.充其量只有3次更新

3> Galwegian..:

FWIW,我认为您建议的方式(即将订单提交到数据库)对您的问题来说并不是一个糟糕的解决方案.我也认为这可能是最安全/最可靠的方式.


别担心 - 没有比使用订购列更好的方法了.至于未来的头痛......不要试图针对您不了解的用例进行优化.

4> 小智..:

如何使用链表实现?有一列将保存下一个项目的值(订单号).我认为这是目前在插入订单时最容易使用的.无需重新编号.



5> Binary Worri..:

不幸的是,这没有灵丹妙药.如果SELECT没有order by子句,您不能保证任何声明的顺序.您需要在其周围添加列和程序.

我不知道我建议在订单序列中添加间隙,具体取决于列表的大小和网站上的点击量,您可能无法获得处理逻辑的过头(您仍然需要以满足所有差距已用完的场合).我会仔细看看这会给你带来什么样的好处.

对不起,我不能提供更好的东西,希望这有帮助.


由于您通常会提取整个购物车以进行显示,因此重新编号整个购物车似乎并不是一个问题.
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有