Избавление от “Волшебных” чисел в SQL Server

В коде можно указать глобально доступные константы/перечисления/и т.д., после того как это может затем быть снова использовано через приложение. Это дает способность использовать понятные имена как '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

Одно ограничение, которое мы имеем, - то, что мы не можем полагаться на Производителя. Имя, остающееся такое же для жизни Приложения. Мы действительно думали о наличии столбца "Code", который никогда не изменяется, и на соединения походят это:

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

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

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

5
задан John Saunders 19 August 2009 в 23:03
поделиться

2 ответа

Мы Сделал это двумя способами:

  • Определяемая пользователем функция, которая возвращает «магическое число» по имени.
  • Используйте столбец nchar (4) вместо столбца int и получайте несколько менее загадочные коды. Таким образом, Nissan будет "NISN" вместо 1. Немного лучше.
4
ответ дан 14 December 2019 в 19:23
поделиться

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

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

1
ответ дан 14 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: