2015-08-28 31 views
1

的順序。如果我有屬性:fruit實體:存儲實體

apple 
banana 
grapes 
tomato 

,並允許功能用戶訂購自己的水果:

1 grapes 
2 apple 
3 tomato 
4 banana 

是否有儲存水果的好方法爲了數據庫,期望可以刪除一個水果,一個結果增加,並且水果重新排序?

一個天真的解決方案是添加一個訂單列。與此有關的問題是昂貴的更新。假設我有一個實體:1000000 durian。我突然決定這是我最喜歡的水果,並將它推到了頂峯。這導致999999水果需要訂單更新。

+0

下面是一篇博客文章,介紹如何進行這種昂貴的更新:http://augustl.com/blog/2013/ordering_cardinality_many_in_datomic/ –

回答

1

在任何數據庫中都沒有內置的方法來實現您的目標,無論是PostgreSQL,Datomic還是其他任何內容。但是,有一個簡單的答案。

只需將您建議的「優先級」列從整數轉換爲浮點值即可。然後,您總是可以在任何兩個現有項目之間插入新條目,而無需更改任何內容。假設你開始

1.0 grape 
2.0 apple 
3.0 tomato 
4.0 banana 

,然後你決定增加一個peargrapeapple之間。只需插入如:

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 

然後,每當你想檢查你的列表中,您只需取兩者的優先級列和名稱列,按優先級排序,然後完成。

+1

優先解決方案:請注意,隨着列表的演變,逐步減半,像漸進式加倍,會很快耗盡甚至64位浮點數的精度。對於長期存在的任何事情,我都會有嚴肅的保留意見。 –

+0

如果你想成爲真正的病態,你總是可以使用像'1.5M'這樣的BigDecimal值。 –

+0

是的,但'病態'可能是描述非常大BigDecimals結果的極好方法;) –

3

簡短的回答是否定的,Datomic沒有這個內置的,並且公平的也沒有其他許多數據庫。

你有你提到的「訂單」列方法,它也有你提到的問題。差距並不是最差的部分,因爲你仍然可以通過一些差距獲得正確的排序,如果你想在中間插入一個項目,情況會變得更糟,那麼就會有來更新下列實體。除非您確定您的對等設備是單線程的,否則您應該在交易功能中完成所有操作。

還有鏈表方法,其中每個實體指向下一個,最後一個不指向任何東西。在中間追加,預先設定和切片成爲恆定的操作。