如果我的实体具有属性:fruit
:
apple
banana
grapes
tomato
以及允许用户订购其水果的功能:
1 grapes
2 apple
3 tomato
4 banana
有没有一种方法可以将水果订单存储到数据库中,期望可以删除水果,添加水果,重新订购水果?
一个天真的解决方案是添加订单栏。问题是昂贵的更新。假设我有一个实体:1000000 durian
。我突然认定它是我最喜欢的水果并将它移到顶部。这导致999999个水果需要订单更新。
答案 0 :(得分:3)
简短的回答是否定的,Datomic没有这个内置,并且公平也没有其他许多数据库。
您提到的“订单”列方法,也有您提到的问题。差距并不是最糟糕的部分,因为你仍然可以通过一些差距得到正确的排序,如果你想在中间插入一个项目,那么你会拥有来更新以下实体。除非你确定你的对等体是单线程的,否则你应该在事务函数中完成所有操作。
还有链表方法,其中每个实体指向下一个,最后一个指向任何东西。中间的追加,前置和切片成为不变的操作。
答案 1 :(得分:1)
没有内置的方法可以在任何数据库中实现您的目标,无论是PostgreSQL,Datomic还是其他任何数据库。但是,有一个简单的答案。
只需将建议的“优先级”列从整数转换为浮点值即可。然后,您始终可以在任何两个现有项之间插入新条目,而无需更改任何内容。假设你从
开始1.0 grape
2.0 apple
3.0 tomato
4.0 banana
然后您决定在pear
和grape
之间添加apple
。只需插入:
1.0 grape
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
然后,您决定在cherry
和grape
之间插入pear
,以便获得:
1.0 grape
1.25 cherry
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
然后,只要你想检查你的列表,你只需要获取优先级列和名称列,按优先级排序,然后就完成了。