sql – 如何存储经常改变DB位置的有序项目

前端之家收集整理的这篇文章主要介绍了sql – 如何存储经常改变DB位置的有序项目前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要能够在DB中存储大量订购商品。到目前为止,这是直截了当的:
ID Position OtherFields
 1     45      ...
 2   4736      ...
 3    514      ...
 ...

查询中,我总是需要获得一些项目(基于OtherFields过滤),但顺序正确。也很容易,在位置上放置一个索引并使用“按位置排序”。

现在问题是:项目经常更改其位置,而不仅仅是1或2.如果ID 2将位置从4736更改为2000,我需要更新其位置和旧位置2000和4735之间所有元素的位置,添加1在每一行。并且不仅每个事务更改一个ID而且还有一些ID,并且可以在短时间内进行许多事务。

我认为处理更新问题最优雅的方法是使用链接列表而不是位置列,我可以通过将ID 2从其旧位置移除,将其前任链接到其后继,然后通过在其之间链接将其插入其他位置。新的前任和继任者。这将是每个职位变更的持续和少量更新,它也是我处理变更的首选方式(在我的案例中是Java)。然而,这提出了以正确的顺序查询的N 1问题 – 即使对于少数元素,我必须在最坏的情况下通过整个列表来找出它们的正确顺序。

所以我的问题是:您建议在必要的更新和查询性能之间取得良好的平衡?

到目前为止,我看到两个有希望的方

>是否存在DBMS(理想情况下为OpenSource),它不仅可以处理链接列表,还可以处理语法糖,但也具有良好的性能,例如:通过使用链接元素的内部指数?
>也许这也是一个选项,只需要一个BLOB,整个链接列表将存储在其中!这样的链接列表有多大/它在数据库中使用了多少内存,当获取时让我们说1.000.000条目?我正在使用Java Hibernate以防万一。我想在获取BLOB后处理内存中的整个列表应该非常快!

但当然也欢迎其他想法!

解决方法

如果放宽约束,即Position列必须包含从1到N的整数,而是允许它包含任何数字,那么您可以有效地进行搜索和更新。

你可以通过计算平均值(AB)DIV 2在位置A和B的两个其他项目之间插入一个项目。例如,如果A是10000而B是12000,那么你的新位置是11000.偶尔你会因为聚类,此时您可以遍历整个表格,更均匀地重新分配位置。

原文链接:https://www.f2er.com/mssql/84458.html

猜你在找的MsSQL相关文章