我想知道是否有人能很好地解决我在过去几年中多次遇到的问题。
我有一个购物车,我的客户明确要求其订单量很大。因此,我需要将订单保留到数据库。
显而易见的方法是简单地插入一些OrderField,在其中我将数字0分配给N并以这种方式对其进行排序。
但是这样做会使重新订购变得更加困难,而且我不知何故觉得此解决方案有些脆弱,总有一天会再次出现在我身上。
(我将C#3,5与NHibernate和SQL Server 2005一起使用)
谢谢
Answers:
FWIW,我认为您建议的方式(即,将订单提交到数据库)并不是解决您的问题的好方法。我也认为这可能是最安全/最可靠的方法。
好的,这是我的解决方案,可以使与此线程相关的任何人都可以更轻松地进行编程。诀窍是能够在一次更新中更新插入/删除上方或下方的所有订单索引。
使用表中的数字(整数)列,SQL查询支持
CREATE TABLE myitems (Myitem TEXT, id INTEGER PRIMARY KEY, orderindex NUMERIC);
要删除订单索引为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更好地使用双链接。单个链接列表要求您拥有整个列表。
不幸的是,对此没有万能的子弹。如果SELECT
没有order by子句,则无法保证任何语句的顺序。您需要添加列并围绕它编程。
我不知道我会建议在订单顺序中添加空白,具体取决于列表的大小和网站上的点击数,您可能会从处理逻辑的开销中获得很少的收益(您仍然需要以满足所有空白都已用尽的情况)。我会仔细看一看,这会给您带来什么好处。
对不起,我无法提供更好的服务,希望对您有所帮助。
我只想插入一个订单字段。这是最简单的方法。如果客户可以重新订购字段,或者您需要在中间插入字段,则只需重写该批次中所有项目的订购字段即可。
如果由于限制了插入和更新的性能而发现此限制,则可以使用varchar字段而不是整数。这样可以在插入时实现很高的精度。例如,要在项目“ A”和“ B”之间插入,您可以插入订购为“ AA”的项目。但是,对于购物车来说,这几乎可以肯定是过头了。
Z
在你的varchar字段排序?
当我使用Hibernate
并且需要保存a的顺序时@OneToMany
,我使用aMap
而不是a List
。
@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL)
@MapKey(name = "position")
@OrderBy("position")
private Map<Integer, RuleAction> actions = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this }));
在此Java示例中,position
是的Integer属性,RuleAction
因此顺序以这种方式保留。我猜在C#中,这看起来很相似。