1

我正面临一个将 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. 我认为这没有任何意义,因为这就是 Index 的原因,我试图为此找到任何解释,但没有找到。这比使用索引更快吗?在任何情况下这真的有用吗?

4

3 回答 3

2

出于多种原因,这可能是有意义的,但主要是当您不想遵循该ORDER BY子句给出的“自然顺序”时。

这是一个有用的场景:

SQL小提琴

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

结果

| ID |      NAME | ORDERBYNAME |
|----|-----------|-------------|
|  1 | Del Torro |           2 |
|  2 |    Delson |           1 |
|  3 |    Delugi |           3 |

查询 2

SELECT *
FROM Table1
ORDER BY OrderByName

结果

| ID |      NAME | ORDERBYNAME |
|----|-----------|-------------|
|  2 |    Delson |           1 |
|  1 | Del Torro |           2 |
|  3 |    Delugi |           3 |
于 2013-11-05T19:02:30.913 回答
2

我认为这没有什么意义,原因有两个:

  1. 谁将在表中维护这组值?每次添加、更新或删除任何行时,您都需要更新它们。您可以使用触发器来执行此操作,或者使用用户定义的函数来执行这些错误且不可靠的约束。但为什么?这些列中似乎存在的信息已经存在。这是多余的,因为您可以通过按实际列排序来获得该顺序。

  2. 您仍然必须使用大量条件或动态 SQL 来告诉应用程序如何对结果进行排序,因为您不能说ORDER BY @column_name.

现在,我的假设基于排序列仍反映相关列中的字母顺序这一事实。如果可以进行一些自定义,这可能会很有用,例如,如果您希望首先列出所有 Smiths,然后是所有 Morts,然后是其他所有人。但我在问题或数据中没有看到任何证据。

于 2013-11-05T19:06:13.807 回答
0

如果排序是可定制的,这可能会很有用——也就是说,如果用户不想按字母顺序查看列表,而是按某种自定义顺序查看列表。

int 列上的索引将小于包含实际文本的列上的索引,但在大多数情况下,我认为这没有任何真正的好处。

于 2013-11-05T19:07:32.800 回答