存储实体的顺序

时间:2015-08-28 01:40:37

标签: datomic

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

apple
banana
grapes
tomato

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

1 grapes
2 apple
3 tomato
4 banana

有没有一种方法可以将水果订单存储到数据库中,期望可以删除水果,添加水果,重新订购水果?

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

2 个答案:

答案 0 :(得分:3)

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

您提到的“订单”列方法,也有您提到的问题。差距并不是最糟糕的部分,因为你仍然可以通过一些差距得到正确的排序,如果你想在中间插入一个项目,那么你会拥有来更新以下实体。除非你确定你的对等体是单线程的,否则你应该在事务函数中完成所有操作。

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

答案 1 :(得分:1)

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

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

开始
1.0 grape
2.0 apple
3.0 tomato
4.0 banana

然后您决定在peargrape之间添加apple。只需插入:

1.0 grape
1.5 pear
2.0 apple
3.0 tomato
4.0 banana

然后,您决定在cherrygrape之间插入pear,以便获得:

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

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