存储实体的顺序
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
然后您决定在 grape
和 apple
之间添加一个 pear
。只需插入如下:
1.0 grape
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
然后你决定在 grape
和 pear
之间插入 cherry
,所以你得到:
1.0 grape
1.25 cherry
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
然后,无论何时您想要检查您的列表,您只需获取优先级列和名称列,按优先级排序,就完成了。
如果我有属性为 :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
然后您决定在 grape
和 apple
之间添加一个 pear
。只需插入如下:
1.0 grape
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
然后你决定在 grape
和 pear
之间插入 cherry
,所以你得到:
1.0 grape
1.25 cherry
1.5 pear
2.0 apple
3.0 tomato
4.0 banana
然后,无论何时您想要检查您的列表,您只需获取优先级列和名称列,按优先级排序,就完成了。