Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 最有效的订购后数据库设计_Sql_Design Patterns_Database Design - Fatal编程技术网

Sql 最有效的订购后数据库设计

Sql 最有效的订购后数据库设计,sql,design-patterns,database-design,Sql,Design Patterns,Database Design,我有posts表,它有post\u顺序列。我把每个帖子的顺序存储在里面。当我将一行的顺序从25改为15时,我应该将所有行从15改为末尾。 这对几排是好的,但在几千排中是最差的 有没有更好的设计来订购更高效的帖子呢?为什么不改变相关的订单,而不是从15个一直往下?假设您有一张这样的桌子: Post Post_Order ---------------------- x 1 y 2 z 3 . . . . t 10 如果要将

我有
posts
表,它有
post\u顺序
列。我把每个帖子的顺序存储在里面。当我将一行的顺序从25改为15时,我应该将所有行从15改为末尾。 这对几排是好的,但在几千排中是最差的


有没有更好的设计来订购更高效的帖子呢?

为什么不改变相关的订单,而不是从15个一直往下?假设您有一张这样的桌子:

Post  Post_Order
----------------------
x       1
y       2
z       3
.       .
.       .
t       10

如果要将t更改为第一个post,可以将t的post顺序更改为1,并将顺序为1(x)的行设置为您首先选择的值(10)。

您可以使用旧的基本技巧(从BASIC仍然有行号开始),即留下间距

例如(无耻地抄袭自):

然后将
t
移动到(比如)第二位将只更新一行:

x       10
t       15
y       20
z       30
.       .
.       .
当然,您仍然需要不时地移动多行(当它们“聚集”太多时),但这应该相对较少(如果出现问题,您可以使初始间隙变大)


或者,继续做你正在做的事情

除非对数千项进行重新排序是非常频繁的,否则现代硬件上的现代DBMS应该不会有太多问题-只需小心从一个命令执行,例如

UPDATE POST
SET POST_ORDER = POST_ORDER + 1
WHERE POST_ORDER > 1 -- AND other criteria

…而不是为每一行发布单独的
更新

这不是我的用例,我只想将t从10移动到1,而不是将x从1移动到10。这是一个好主意
UPDATE POST
SET POST_ORDER = POST_ORDER + 1
WHERE POST_ORDER > 1 -- AND other criteria