我想知道是否有人对我在过去几年中多次遇到的问题有一个好的解决方案。

我有一个购物车,我的客户明确要求它的订单很重要。所以我需要将订单持久化到数据库。

最明显的方法是简单地插入一些 OrderField,在其中我将数字 0 分配给 N 并以这种方式对其进行排序。

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

(我将 C# 3,5 与 NHibernate 和 SQL Server 2005 一起使用)

谢谢

有帮助吗?

解决方案

FWIW,我觉得你的建议的方式(即在提交订单到数据库)是个不错的解决您的问题。我也觉得这可能是最安全/最可靠的方式。

其他提示

确定这里是我的解决方案,使编程更容易些的人沿着这个线索情况。特技是能够更新的上方或下方的插入/缺失的所有次序索引在一个更新。

使用数字(整数)列在表中,由所述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)

最佳的解决方案是href="http://en.wikipedia.org/wiki/Doubly_linked_list">双重链接列表一个

0,10,20类型失败。顺序列的人会失败。浮子序列列失败在组移动。

双链表为添加,移除,删除组,组另外,组移动相同的操作。单链表工程确定了。双挂在我看来是与SQL更好不过。单链表需要你有整个列表。

如何使用链表实现?具有下一个项目的一列将持有的值(订单号)。我认为这是迄今为止最容易在两者之间做订单的插入时使用。没有必要重新编号。

不幸的是没有灵丹妙药这一点。你无法机制保障任何SELECT语句的顺序进行而不order by子句。你需要周围添加列和程序。

我不知道,我会推荐顺序中添加空白,这取决于你的列表的大小,并在网站上的点击,你可能会获得很少的处理逻辑的头顶(你” ð仍然需要满足,所有的缝隙都被用完)的场合。我得好好看看,看看有什么了好处,这将让你在你的情况。

对不起,我不能提供任何更好的,希望这有助于。

我不推荐的A,AA,B,BA,BB的方法在所有。有参与,以确定层次和插入条目很多额外的处理中是不好玩之间都没有。

只需添加一个OrderField,整数。不要使用空白,因为你必须要么用你的下一个中间插入一个非标准的“步”的工作,否则你就必须先重新同步列表,然后添加新条目。

为0 ... N容易重新排序,如果你可以使用Array方法或列表方式SQL外部的重新排序的集合作为一个整体,然后更新每个条目,或者你可以计算出你在哪里插入,和+1或-1之后或之前,相应的每个条目。

一旦你有这方面写了一个小库,它会是小菜一碟。

我只插入一个顺序字段。它的最简单的方法。如果客户可以重新排序字段,或者您需要在中间插入然后就改写顺序字段在该批次的所有项目。

如果在线下你觉得这个限制是由于在插入和更新性能不佳则有可能使用varchar字段,而不是一个整数。这使得相当高的精度水平插入时。例如,将项目“A”和“B”之间插入您可以插入排序为“AA”的项目。这是几乎可以肯定矫枉过正对于购物车,虽然。

在抽象上面的车项目的水平,让我们说CartOrder(即有1-N与CartItem),你可以保持一个名为itemOrder场这可能只是一个逗号 - ID(PK)的分隔列表的cartItem记录有关。它会在你需要能够解析并相应地安排您的项目模型的应用层。这种方法的大加会为了reshufflings的情况下,有可能不会对个别对象的变化,但由于订单持续的订单项目表行内的索引字段,你将不得不发出的每一个更新命令行更新他们的索引字段。    请让我知道这种方法你的批评,我很好奇,想知道在哪个方面,这可能会失败。

我解决了 务实地 像这样:

  1. 该顺序在 UI 中定义。

  2. 后端收到一个 POST 请求,其中包含列表中每个项目的 ID 和相应的位置。

  3. 我开始一项交易并更新每个 ID 的仓位。

完毕。

所以订购很贵,但阅读订购的清单却非常便宜。

我会建议保持在订单数量的差距,所以不是1,2,3等,用10,20,30 ......如果你只是需要插入一个多项目,你可以把它放在15,而比在该点处的重新排序的一切。

好了,我会说简单的答案是:

创建autoidentity在cartcontents表中的主键,则在正确的自上而下的顺序插入的行。然后,通过将主键列autoidentity从表中选择与订单会给你同样的列表。通过这样做,你必须删除所有项目,并改建为车内容的情况下,然后重新插入。 (但是,这仍然是这样做的相当干净的方式),如果这不可行,则与顺序列去喜欢别人建议。

当我使用Hibernate,并需要保存@OneToMany的顺序,我使用Map而不是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示例,positionRuleAction的整数属性,以便顺序被持久的方式。我想在C#这看起来颇为相似。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top