数据库设计 – 任意订购表中的记录

前端之家收集整理的这篇文章主要介绍了数据库设计 – 任意订购表中的记录前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用数据库时的常见需求是按顺序访问记录.例如,如果我有一个博客,我希望能够以任意顺序重新排序我的博客帖子.这些条目通常有很多关系,因此关系数据库似乎有意义.

我见过的常见解决方案是添加整数列顺序:

CREATE TABLE AS your_table (id,title,sort_order)
AS VALUES
  (0,'Lorem ipsum',3),(1,'Dolor sit',2),(2,'Amet,consect',0),(3,'Elit fusce',1);

然后,我们可以按顺序对行进行排序,以便按正确顺序对它们进行排序.

但是,这看起来很笨拙:

>如果我想将记录0移到开头,我必须重新排序每条记录
>如果我想在中间插入一条新记录,我必须重新排序后面的每条记录
>如果我想删除记录,我必须重新排序后面的每条记录

很容易想象以下情况:

>两个记录具有相同的顺序
>记录之间的顺序存在差距

出于多种原因,这些可能相当容易发生.

这是像Joomla这样的应用程序采用的方法

你可以说这里的界面很糟糕,而不是人类直接编辑数字,他们应该使用箭头或拖放 – 你可能是对的.但在幕后,同样的事情正在发生.

有些人建议使用小数来存储订单,这样你就可以使用“2.5”在第2和第3顺序的记录之间插入一条记录.虽然这有点帮助,但它可能会更加混乱,因为你可以最终得到奇怪的小数(你在哪里停止?2.75?2.875?2.8125?)

有没有更好的方法来存储表中的订单?

解决方法

If I want to move record 0 to the start,I have to reorder every record

不,有一种更简单的方法.

update your_table
set order = -1 
where id = 0;

If I want to insert a new record in the middle,I have to reorder every record after it

这是真的,除非您使用支持“之间”值的数据类型.浮点数和数字类型允许您将值更新为2.5.但varchar(n)也有效. (想想’a’,’b’,’c’;然后想’ba’,’bb’,’bc’.)

If I want to remove a record,I have to reorder every record after it

不,有一种更简单的方法.只需删除该行即可.其余行仍将正确排序.

It’s easy to imagine a situations like:

Two records have the same order

唯一约束可以防止这种情况.

There are gaps in the order between records

间隙对dbms如何对列中的值进行排序没有影响.

Some people have proposed using a decimal to store order,so that you can use “2.5” to insert a record in between the records at order 2 and 3. And while that helps a little,it’s arguably even messier because you can end up with weird decimals (where do you stop? 2.75? 2.875? 2.8125?)

你不必停下来. dbms对小数点后面有2个,7个或15个位置的值进行排序没有问题.

我认为你真正的问题是你希望以排序顺序看到整数值.你可以做到这一点.

create table your_table (
  id int primary key,title varchar(13),sort_order float
);

insert into your_table values
(0,2.0),1.5),0.0),1.0);

-- This windowing function will "transform" the floats into sorted integers.
select id,row_number() over (order by sort_order)
from your_table

猜你在找的MsSQL相关文章