我运行(并且目前正在彻底检修)一个处理剧院的网站(如果您有兴趣,请访问 njtheater.com)。
当我从数据库中查询戏剧列表时,我希望“威尼斯商人”在“M”下排序。当然,当我显示剧名时,我需要前面的“The”。
设计数据库来处理这个问题的最佳方法是什么?
(我使用的是 MS-SQL 2000)
我运行(并且目前正在彻底检修)一个处理剧院的网站(如果您有兴趣,请访问 njtheater.com)。
当我从数据库中查询戏剧列表时,我希望“威尼斯商人”在“M”下排序。当然,当我显示剧名时,我需要前面的“The”。
设计数据库来处理这个问题的最佳方法是什么?
(我使用的是 MS-SQL 2000)
您在两列的正确轨道上,但我建议将整个可显示的标题存储在一列中,而不是连接列。另一列纯粹用于排序。这使您在排序和显示方面具有完全的灵活性,而不是被简单的前缀所束缚。
这是搜索时相当常见的方法(与排序有关)。一列(带有索引)是大小写折叠、取消标点符号等。在您的情况下,您还可以将删除前导文章的语法约定应用于该字段中的值。然后将此列用作搜索或排序的比较键。另一列未编入索引,并保留原始键以供显示。
将标题存储在两个字段中:TITLE-PREFIX 和 TITLE-TEXT(或类似的)。然后对第二个进行排序,但显示两者的串联,中间有一个空格。
我自己的解决方案是在数据库中创建三列。
article varchar(4)
sorttitle varchar(255)
title computed (article + sortitle)
“article” 只能是“The”、“A”、“An”(注意每个尾随空格)或空字符串(非空)
"sorttitle" 将是删除了前导文章的标题。
这样,我可以对 SORTTITLE 进行排序并显示 TITLE。计算域上几乎没有实际处理(所以它很快),插入时只需做一点工作。
我同意 doofledorfer,但我建议将输入的空格存储为前缀的一部分,而不是假设它是单个空格。它为您的用户提供了更大的灵活性。您也可以在查询本身中进行一些连接,因此您不必将字段合并为业务逻辑的一部分。
我不知道这是否可以在 SQL Server 中完成。如果您可以创建基于函数的索引,则可以创建一个在该字段上执行正则表达式或使用您自己的函数的索引。这将比附加字段占用更少的空间,由数据库本身保持最新,并允许将完整的标题存储在一起。