创建可按列排序的数据库表的最佳方法

时间:2014-06-18 22:20:04

标签: sql rdbms

我有一个包含未排序行的表,并希望通过列对它们进行排序。我希望表可以按列排序,因此我创建了一个sort_by列。

现在的表格如下:

ID  Data   sort_by
--  -----  -------
27  Blahh  1  
54  Blahh  2  
57  Blahh  3  
1   Blahh  4

现在我想在第二个位置插入一行(sort_by = 2)。然后我将不得不为所有行更新sort_by> 2,sort_by + = 1.如果我有几百万行,那就是很多更新。

那么,有这样的规范方法吗?当然我可以在列之间有更大的步骤并在间隙等中插入新行,但是有一种美观的方式,即不是黑客?

排序由用户手动完成。 google for = upvote是一个很好的短语,我尝试的所有内容都会在某些DBMS或某个框架中对表进行排序。 :)

2 个答案:

答案 0 :(得分:1)

没有人手动排序一百万行。这里有一个classic XY Problem

你在问:

  

如何在SQL数据库中对一百万行进行排序?

当你应该问:

  

如何在传统关系数据库管理系统中管理的在线商店中推广某些产品?

前者需要一堆hacky解决方案,例如权重,或精度不断扩大的十进制列,或数据库链表。所有这些都容易出错,这是违反直觉的,并忽略了问题域。

你评论说:

  

考虑您想要在网上商店的起始页面上展示的产品 - 营销团队认为会销售的产品

那么,首页上我想要什么类型的产品?特色产品,正在销售的产品,新产品,即将缺货的产品......

-- Wacky featured items are random!
SELECT * FROM products WHERE featured = True ORDER BY RANDOM LIMIT 10;
-- More than 20% wow, thats a great deal!
SELECT * FROM products WHERE discount > 0.2 ORDER BY discount ASC LIMIT 10;
-- New stock, tell me about it!
SELECT * FROM products WHERE added_to_database < now()-24hours ORDER BY added_to_database LIMIT 10;
-- These items are about to disappear for ever, buy now!
SELECT * FROM products WHERE stock_number < 20 ORDER BY stock_number LIMIT 10;

想想你为什么要订购它们,而不是如何订购它们。通过这种方式,您可以根据某些标准获得一些标准,并且它可以更紧密地模拟您正在使用的域。

答案 1 :(得分:0)

我能想到的两种方式。

1)将sort_by更改为小数。您将始终[a]能够在现有值之间插入一个包含更多小数位的新行。

2)将sort_by替换为comes_after_ID,将表格转换为链接列表。这是指向YourTable.ID的外键。

ID  Data   Comes_after_ID
--  -----  --------------
27  Blahh  NULL
54  Blahh  27
57  Blahh  54 
1   Blahh  57

使用第二种设计,在应用程序代码而不是SQL中进行排序会更容易。

无论哪种方式,拖放式GUI都可以向用户隐藏此实现。

[a]当然,Always(TM)仅限于系统上的小数分辨率。最终,您将不得不重新排序您的项目。但这可以作为月度工作而不是用户处理输入来完成。