Я реализую базу данных, в которой несколько таблиц имеют строковые данные в качестве ключей-кандидатов (например, имя пользователя) и будут соответствующим образом проиндексированы.Для этих полей я хочу:
Нечувствительность к регистру, когда кто-то запрашивает таблицу по этим ключам
Первоначально записанный кейс как-то сохраняется, чтобыприложение может представить данные пользователю с использованием исходного регистра
Я также хочу, чтобы схема базы данных была настолько независимой от базы данных, насколько это возможно, поскольку код приложения является (или не должен быть) не подчинено конкретной СУБД.
Также стоит отметить, что подавляющее большинство запросов к базе данных будет выполняться кодом приложения, а не с помощью прямого доступа к таблице со стороны клиента.
При реализации этого я сталкиваюсь с множеством раздражающих проблем.Одна из них заключается в том, что не все СУБД реализуют COLLATE (в этом случае чувствительность к регистру настраивается на уровне схемы) одинаково.Другая проблема заключается в том, что параметры сортировки и чувствительности к регистру могут быть установлены на нескольких уровнях (сервер, база данных, таблица (?), Столбец), и я не могу гарантировать приложению, какие настройки он получит.Еще одна проблема заключается в том, что сам COLLATE может стать волосатым, потому что в нем есть намного больше, чем просто чувствительность к регистру (например, параметры Unicode).
Чтобы избежать всех этих головных болей, то, что я рассматриваюполностью уклоняется от проблемы, сохраняя два столбца для одного фрагмента данных.Один столбец с исходным регистром, другой - с нижнего регистра на прикладном уровне.
Например: два поля в таблице
user_name = "fredflintstone" (a unique index on this one)
orig_name = "FredFlintstone" (just data... no constraints)
Плюсы и минусы этого, как я вижуэто:
Плюсы:
Нет двусмысленности - код приложения будет управлять преобразованиями кейсов, и мне никогда не нужно беспокоиться о сбоях модульных тестов«таинственно», когда изменяется базовая СУБД / настройки.
Поиск в индексе будет чистым и никогда не будет замедлен функциями сортировки или вызовами LOWER () или чем-либо (при условии, что такие вещизамедление индекса, что кажется логичным)
Минусы:
Для удвоения требуется дополнительное место для храненияdata
Кажется немного грубоватым
Я знаю, что это будет работать, но в то же время пахнет неправильно.
Это безумие / бессмысленно делать это?Есть ли что-то, чего я не знаю, что делает проблему с чувствительностью к регистру менее сложной, чем мне кажется на данный момент?