Каков наилучший способ сохранить заголовок в базе данных, чтобы разрешить сортировку без ведущих "The", "A" - PullRequest
8 голосов
/ 10 ноября 2008

Я управляю (и в настоящее время полностью перерабатываю) веб-сайтом, который занимается театром (njtheater.com, если вам интересно).

Когда я запрашиваю список пьес из базы данных, я бы хотел, чтобы "Венецианский торговец" сортировал под буквой "М". Конечно, когда я показываю название пьесы, мне нужно "The" впереди.

Каков наилучший способ проектирования базы данных для этого?

(я использую MS-SQL 2000)

Ответы [ 5 ]

17 голосов
/ 10 ноября 2008

Вы находитесь на правильном пути с двумя столбцами, но я бы предложил хранить весь отображаемый заголовок в одном столбце, а не объединять столбцы. Другой столбец используется исключительно для сортировки. Это дает вам полную гибкость при сортировке и отображении, вместо того, чтобы застрять с простым префиксом.

Это довольно распространенный подход при поиске (который связан с сортировкой). Один столбец (с индексом) - это регистр, лишенный пунктуации и т. Д. В вашем случае вы также примените грамматическое соглашение об удалении ведущих статей для значений в этом поле. Этот столбец затем используется в качестве ключа сравнения для поиска или сортировки. Другой столбец не индексируется и сохраняет исходный ключ для отображения.

1 голос
/ 10 ноября 2008

Моим собственным решением проблемы было создание трех столбцов в базе данных.

article   varchar(4)
sorttitle varchar(255)
title     computed (article + sortitle)

«article» будет представлять собой либо «The», «A», «An» (на каждой из них следует пробел), либо пустую строку (не ноль)

Заголовок "sorttitle" будет удален с ведущей статьи.

Таким образом, я могу сортировать по SORTTITLE и отображать TITLE. На вычисляемом поле происходит небольшая фактическая обработка (поэтому она быстрая), и для вставки требуется лишь небольшая работа.

1 голос
/ 10 ноября 2008

Сохраните заголовок в двух полях: TITLE-PREFIX и TITLE-TEXT (или некоторые такие). Затем выполните сортировку по второму, но отобразите объединение двух с пробелом между ними.

0 голосов
/ 11 ноября 2008

Я не знаю, можно ли это сделать в SQL Server. Если вы можете создавать индексы на основе функций, вы можете создать индекс, который выполняет регулярное выражение в поле или использует вашу собственную функцию. Это займет меньше места, чем дополнительное поле, будет обновляться самой базой данных и позволяет хранить полный заголовок вместе.

0 голосов
/ 10 ноября 2008

Я согласен с doofledorfer, но я бы рекомендовал хранить пробелы, введенные как часть префикса, вместо предположения, что это один пробел. Это дает вашим пользователям больше гибкости. Вы также можете выполнить некоторую конкатенацию в самом запросе, поэтому вам не нужно объединять поля как часть вашей бизнес-логики.

...