Избавление от «магических» чисел в SQL Server - PullRequest
5 голосов
/ 26 июня 2009

В коде можно указать глобально доступные константы / перечисления / и т. Д., Которые затем могут быть повторно использованы в приложении. Это дает возможность использовать значимые имена, такие как «Mazda» вместо цифр, таких как «2».

Мы хотели бы сделать то же самое в наших хранимых процедурах SQL Server, но не уверены в наилучшем способе реализации этого.

Например, для следующих таблиц (схема пресловутой машины):

Car       ManufacturerId 
350Z       1
Hilux      2
Yaris      2

ManufacturerId   Name
1                Nissan
2                Toyota

Так что вместо того, чтобы писать

SELECT * FROM Car WHERE ManufacturerId = 1 -- Nissan

Мы хотели бы написать что-то вроде

SELECT * FROM Car WHERE ManufacturerId = @Nissan

Одно из ограничений, которое у нас есть, заключается в том, что мы не можем полагаться на то, что Manufacturer.Name остается неизменным в течение всего срока службы Приложения. Мы действительно думали о столбце «Код», который никогда не меняется, и объединения выглядят так:

SELECT * 
FROM Car c 
    INNER JOIN Manufacturer m ON c.ManufacturerId = m.ManufacturerId
WHERE m.Code = 'Nissan'

Я немного сомневаюсь в этом, поскольку он использует дополнительное объединение и сравнение строк, которые могут быть написаны с ошибками.

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

Ответы [ 2 ]

4 голосов
/ 26 июня 2009

Мы сделали это несколькими способами:

  • Определяемая пользователем функция, которая возвращает «магическое число» по имени.
  • Используйте столбец nchar (4) вместо столбца int и придумайте немного меньше непостижимых кодов. Так что Nissan будет «NISN» вместо 1. Немного приятнее.
1 голос
/ 26 июня 2009

Вам не нужно хранить номера в базе данных. Есть администраторы БД, которым все еще нравится идея «естественных ключей». Вместо использования идентификатора они просто используют естественный ключ, который однозначно определяет производителя. Часто это может привести к нескольким первичным ключам. Возможно, вам понадобится 'Mazda' 'Canada' в качестве уникального идентификатора производителя.

Лично мне не нравится этот метод, и я предпочитаю иметь уникальный идентификатор для каждого идентифицируемого объекта, хранящегося в моих таблицах. Это означает создание новой таблицы, которая является поиском. 2, «Мазада». Затем вы можете создать представление, которое тянет 'Mazda' туда, где есть 2 в базе данных, а затем выполнить запрос к представлению. SELECT * из v_cars, где maker = 'Mazda'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...