SQL Server:使用列保存记录的顺序

时间:2013-11-05 18:52:05

标签: sql sql-server database database-design relational-database

我正面临一个数据库,它将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。 我认为这没有任何意义,因为这就是为什么索引是为了,我试图找到任何解释,但没有找到。这比使用索引更快吗?有没有这种情况真的有用?

3 个答案:

答案 0 :(得分:2)

这有很多道理,但主要是因为你不想遵循"自然秩序"由ORDER BY子句给出。

这是一个有用的场景:

SQL Fiddle

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)

我认为这有两点原因:

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

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

  3. 现在,我的假设基于订购列仍然反映相关列中的字母顺序这一事实。如果可以进行一些定制,例如,它可能是有用的。如果你想要所有史密斯先列出,然后是所有Morts,然后是其他所有人。但我在问题或数据中没有看到任何证据。

答案 2 :(得分:0)

如果订购是可自定义的,那么这可能很有用 - 也就是说,如果用户不希望按字母顺序查看列表,而是按照某种自定义顺序查看。

int列的索引小于保存实际文本的列的索引,但在大多数情况下,我没有看到对此有任何实际好处。