以用户指定的顺序存储数据

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),它应该在 foohello 之间,我需要更改 hellobar 的顺序字段,所以表格将是这样的:

order  name
-----------
2      hello
0      foo
3      bar
1      new
这种方法正确吗? 重新编号过程不能非常 如果表包含很多行,速度会变慢吗? 对于这类问题有更好的方法吗?

【问题讨论】:

该方法是“自然的”(您无法避免将“人工索引”添加到 sort "nominal" attributes),但您可以改进(重新排序)...例如通过选择不是 (0,1,2...) 而是 (0,10,20,...) ;) 也许表格中有另一列您可能已经排序?否则你为什么会决定展示新的高于其他人? @ekochergin 是最终用户决定在foohello 之间插入new 这很可悲。那么我在答案中看不到任何其他解决方案,而不是那个解决方案 您多久插入或交换一次值以及您多久执行一次 select ... order by? 【参考方案1】:

正如您所说,当您有一个新项目时重新编号整个表格可能不是一个好主意。

一种常见的做法是在编号值中保留足够的间隙,以便您可以在它们之间插入新值。例如,如果您从 0、100 和 200 开始,则新值很容易为 50。 请注意,理论上,您还可以使用浮点数,这将使您能够在每个值之间插入无限的新值。实际上,数据库可以存储这些浮点数的精度是有限的(取决于 RDBMS 和列定义)。

【讨论】:

如果您使用 100 的间隙并为每个插入使用 (a+b)/2,如果有人在位置 2 重复插入一个项目,则需要 6 次尝试才会出现问题。

以上是关于以用户指定的顺序存储数据的主要内容,如果未能解决你的问题,请参考以下文章

顺序表

线性表之顺序存储-顺序表

[数据结构] 线性表的顺序存储方式

线性表--02---顺序表

顺序表与链表

《数据结构》复习之线性表(顺序表和链表)