存储实体的顺序

Storing the order of entities

如果我有属性为 :fruit 的实体:

apple
banana
grapes
tomato

以及允许用户订购水果的功能:

1 grapes
2 apple
3 tomato
4 banana

有没有一种好的方法可以将水果顺序存储到数据库中,并期望可以删除一个水果,添加一个水果,然后重新排序水果?

一个天真的解决方案是添加一个订单列。一个问题是昂贵的更新。假设我有一个实体:1000000 durian。我突然决定这是我最喜欢的水果并将其移至顶部。这导致 999999 个水果需要更新订单。

简短的回答是否定的,Datomic 没有内置这个,公平地说,许多其他数据库也没有。

你有你提到的"order"列方法,也有你提到的问题。差距并不是最糟糕的部分,因为你仍然可以在有一些差距的情况下得到正确的排序,如果你想在中间插入一个项目,它会变得更糟,然后你 必须 更新以下实体。除非您确定您的对等方是单线程的,否则您可能应该在事务函数中完成所有操作。

还有链表方法,其中每个实体都指向下一个实体,而最后一个实体不指向任何东西。中间的追加、前置和切片成为常量操作。

在任何数据库中都没有实现您的目标的内置方法,无论是 PostgreSQL、Datomic 还是任何数据库。但是,有一个简单的答案。

只需将建议的 "priority" 列从整数转换为浮点值。然后,您始终可以在任何两个现有项目之间插入一个新条目,而无需更改任何内容。假设您从

开始
1.0 grape
2.0 apple
3.0 tomato
4.0 banana

然后您决定在 grapeapple 之间添加一个 pear。只需插入如下:

1.0 grape
1.5 pear
2.0 apple
3.0 tomato
4.0 banana

然后你决定在 grapepear 之间插入 cherry,所以你得到:

1.0  grape
1.25 cherry
1.5  pear
2.0  apple
3.0  tomato
4.0  banana

然后,无论何时您想要检查您的列表,您只需获取优先级列和名称列,按优先级排序,就完成了。