我正面临一个数据库,它将ORDERING保存在表的列中。
就像:
Id Name Description Category OrderByName OrderByDescription OrderByCategory
1 Aaaa bbbb cccc 1 2 3
2 BBbbb Aaaaa bbbb 2 1 2
3 cccc cccc aaaaa 3 3 1
因此,当用户希望按名称排序时,SQL会使用ORDER BY OrderByName
。
我认为这没有任何意义,因为这就是为什么索引是为了,我试图找到任何解释,但没有找到。这比使用索引更快吗?有没有这种情况真的有用?
答案 0 :(得分:2)
这有很多道理,但主要是因为你不想遵循"自然秩序"由ORDER BY
子句给出。
这是一个有用的场景:
MS SQL Server 2008架构设置:
CREATE TABLE Table1
([Id] int, [Name] varchar(15), [OrderByName] int)
;
INSERT INTO Table1
([Id], [Name], [OrderByName])
VALUES
(1, 'Del Torro', 2 ),
(2, 'Delson', 1),
(3, 'Delugi', 3)
;
查询1 :
SELECT *
FROM Table1
ORDER BY Name
<强> Results 强>:
| ID | NAME | ORDERBYNAME |
|----|-----------|-------------|
| 1 | Del Torro | 2 |
| 2 | Delson | 1 |
| 3 | Delugi | 3 |
查询2 :
SELECT *
FROM Table1
ORDER BY OrderByName
<强> Results 强>:
| ID | NAME | ORDERBYNAME |
|----|-----------|-------------|
| 2 | Delson | 1 |
| 1 | Del Torro | 2 |
| 3 | Delugi | 3 |
答案 1 :(得分:2)
我认为这有两点原因:
谁将在表中维护这组值?每次添加,更新或删除任何行时,都需要更新它们。您可以使用触发器执行此操作,或使用用户定义的函数执行可怕的错误和不可靠的约束。但为什么?似乎在列中的信息已经存在。这是多余的,因为您可以通过实际列的排序来获得该订单。
您仍然必须使用大量条件或动态SQL来告诉应用程序如何订购结果,因为您不能说ORDER BY @column_name
。
现在,我的假设基于订购列仍然反映相关列中的字母顺序这一事实。如果可以进行一些定制,例如,它可能是有用的。如果你想要所有史密斯先列出,然后是所有Morts,然后是其他所有人。但我在问题或数据中没有看到任何证据。
答案 2 :(得分:0)
如果订购是可自定义的,那么这可能很有用 - 也就是说,如果用户不希望按字母顺序查看列表,而是按照某种自定义顺序查看。
int列的索引小于保存实际文本的列的索引,但在大多数情况下,我没有看到对此有任何实际好处。