我想知道是否有人能够很好地解决我在过去几年遇到过的问题.
我有一个购物车,我的客户明确要求它的订单很重要.所以我需要将订单持久保存到DB.
显而易见的方法是简单地插入一些OrderField,我将数字0分配给N并以这种方式对其进行排序.
但这样做会使重新排序变得更加困难,我不知何故觉得这个解决方案有点脆弱,有一天会回到我身边.
(我在NHibernate和SQL Server 2005中使用C#3,5)
谢谢
好的,这是我的解决方案,使这个线程发生的任何人都可以更容易地编程.诀窍是能够在一次更新中更新插入/删除之上或之下的所有订单索引.
使用表中的数字(整数)列,由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)
最佳解决方案是双向链接列表.O(1)用于除索引之外的所有操作.除了你想要的项目的where子句之外,没有什么能快速索引SQL.
0,10,20种类型失败.序列列失败.组移动时浮动序列列失败.
双向链接列表与添加,删除,组删除,组添加,组移动相同.单链表也可以.在我看来,双链接更好用SQL.单链表要求您拥有整个列表.
FWIW,我认为您建议的方式(即将订单提交到数据库)对您的问题来说并不是一个糟糕的解决方案.我也认为这可能是最安全/最可靠的方式.
如何使用链表实现?有一列将保存下一个项目的值(订单号).我认为这是目前在插入订单时最容易使用的.无需重新编号.
不幸的是,这没有灵丹妙药.如果SELECT
没有order by子句,您不能保证任何声明的顺序.您需要在其周围添加列和程序.
我不知道我建议在订单序列中添加间隙,具体取决于列表的大小和网站上的点击量,您可能无法获得处理逻辑的过头(您仍然需要以满足所有差距已用完的场合).我会仔细看看这会给你带来什么样的好处.
对不起,我不能提供更好的东西,希望这有帮助.