0

我的非 sql 数据库中有一个非常大的元素列表。

每个元素都有一个从 1 到 N 的排序顺序。这种排序顺序指定了结果在表单上的显示方式。

当在 UI 中触发顺序更改时(将元素 i 放在位置 j 中),我需要更新它们之间的所有实体。如果元素 1 成为最新的,我需要进行 N 次更新。

有没有一种有效的方法可以降低此操作的成本?有没有一种聪明的方法来索引排序值?

一些考虑:

  • 我正在重新设计我的应用程序,以便能够使用更智能的解决方案重新索引实体。
  • 写入(更新)的成本是提取(读取 1 个实体)的 +-4 倍。
  • 列表很大,不适合内存。
4

4 回答 4

2
  1. 重新索引您的实体。将 order 属性设置为 double。
  2. 每次用户将实体移动到新位置时,在其他两个实体之间为其分配一个新的 order 属性:

    entityA.setOrder((entityB.getOrder() + entityC.getOrder())/2);

  3. 保存实体 A(属性“订单”应该被索引)。

  4. 当用户请求从 10000 到 10200 的实体时,使用排序顺序在您的 order 属性上构建一个查询。从 10000 到 10200 检索结果:

    datastore.prepare(q).asList(FetchOptions.Builder.withOffset(10000).limit(200));

  5. 永远不要重新索引您的实体。每次您保存实体时,Datastore 都会为您执行此操作。

于 2012-09-25T22:20:11.917 回答
1

I'm assuming you're storing entities in the GAE datastore and letting the datastore index the entities for you. The datastore uses a linked-list like index, but you don't have access to the linked list.

I don't think there's a perfect mechanism, but instead of sorting your N items from 1..N, I'd use a large sparse set of numbers (for example, use floats), and evenly distribute your entities across that range. Whenever you sort an item, simply generate a new index value that exists between the two new neighbors.

If you hit a worst case scenario, where the neighbors are too close together, generate new indexes for the neighbors, and so forth. A more advanced system might guarantee that there is a minimum amount of space between entities after every re-sort, and reindex a few extra neighbors proactively.

于 2012-09-26T01:48:23.743 回答
-1

在我看来,您当前的模型没有其他选择。像索引集合一样,您必须在移动元素时“重新索引”元素:减少或增加集合的一部分

更改模型可能是满足您要求的解决方案。您可以尝试将其设计为链表,其中删除/移动/插入操作“更便宜”。每个元素都知道它的下一个(简单)或下一个和上一个元素(双)

于 2012-09-25T21:03:17.807 回答
-2

您可以将排序顺序和 UI 数据与每个实体中的其他大量数据分开。后者可以保持不变。

嗯,如果你有这个:

entitles = [bigdata1, bigdata2, bigdata3, ...]
order_numbers = [2, 3, 1, ...]

order_numbers 可以是排序的结果,也可以是任意用户定义的值。

那么你有

display_order = [2, 0, 1, ...]

表示首先显示 bigdata3。如果 UI 无论如何都想更改订单,只有 order_numbers 和 display_order 需要更改,而不是 entitles。这是我的理解。

于 2012-09-25T21:24:27.067 回答