数据库设计 – 任意订购表中的记录
使用数据库时的常见需求是按顺序访问记录.例如,如果我有一个博客,我希望能够以任意顺序重新排序我的博客帖子.这些条目通常有很多关系,因此关系数据库似乎有意义.
我见过的常见解决方案是添加整数列顺序: 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?) 有没有更好的方法来存储表中的订单? 解决方法
不,有一种更简单的方法. update your_table set order = -1 where id = 0;
这是真的,除非您使用支持“之间”值的数据类型.浮点数和数字类型允许您将值更新为2.5.但varchar(n)也有效. (想想’a’,’b’,’c’;然后想’ba’,’bb’,’bc’.)
不,有一种更简单的方法.只需删除该行即可.其余行仍将正确排序.
唯一约束可以防止这种情况.
间隙对dbms如何对列中的值进行排序没有影响.
你不必停下来. 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |