以用户指定的顺序存储数据
Posted
技术标签:
【中文标题】以用户指定的顺序存储数据【英文标题】:Storing data in a user specified order 【发布时间】:2021-11-26 11:21:53 【问题描述】:我知道在 SQL 数据库中,数据不是按特定顺序存储的,并且只能通过 ORDER BY
语句进行排序。
如果我需要以任意顺序存储数据,通常的方法是什么?
例子:
我有名字,我想以某种任意顺序存储它们,例如:
name
-----
foo
hello
bar
一种方法是有一个辅助字段order
,如下所示:
order name
-----------
1 hello
0 foo
2 bar
然后我可以按order
字段排序。
但如果我需要插入另一个名称 (newname
),它应该在 foo
和 hello
之间,我需要更改 hello
和 bar
的顺序字段,所以表格将是这样的:
order name
-----------
2 hello
0 foo
3 bar
1 new
这种方法正确吗?
重新编号过程不能非常
如果表包含很多行,速度会变慢吗?
对于这类问题有更好的方法吗?
【问题讨论】:
该方法是“自然的”(您无法避免将“人工索引”添加到 sort "nominal" attributes),但您可以改进(重新排序)...例如通过选择不是 (0,1,2...) 而是 (0,10,20,...) ;) 也许表格中有另一列您可能已经排序?否则你为什么会决定展示新的高于其他人? @ekochergin 是最终用户决定在foo
和hello
之间插入new
。
这很可悲。那么我在答案中看不到任何其他解决方案,而不是那个解决方案
您多久插入或交换一次值以及您多久执行一次 select ... order by?
【参考方案1】:
正如您所说,当您有一个新项目时重新编号整个表格可能不是一个好主意。
一种常见的做法是在编号值中保留足够的间隙,以便您可以在它们之间插入新值。例如,如果您从 0、100 和 200 开始,则新值很容易为 50。 请注意,理论上,您还可以使用浮点数,这将使您能够在每个值之间插入无限的新值。实际上,数据库可以存储这些浮点数的精度是有限的(取决于 RDBMS 和列定义)。
【讨论】:
如果您使用 100 的间隙并为每个插入使用 (a+b)/2,如果有人在位置 2 重复插入一个项目,则需要 6 次尝试才会出现问题。以上是关于以用户指定的顺序存储数据的主要内容,如果未能解决你的问题,请参考以下文章