предложение по использованию внешнего ключа и таблицы значений и мастер-таблиц - PullRequest
0 голосов
/ 29 августа 2018

У меня есть разные таблицы в моих SQL server database, и большинство таблиц ссылаются на такие поля, как статус (определенного объекта), категория (определенного объекта), тип (определенного объекта) и т. Д., Где эти статусы, категории, типы и т. д. взяты из отдельных собственных основных таблиц (например, таблица для StatusMaster и т. д.).

Я хочу знать, что является лучшей практикой: a) поля статуса / категории / типа в основных таблицах должны иметь поля типа varchar / text, представляющие значения из основных таблиц б) или они должны быть foreign keys (int)

Я думаю, что в идеале это должно быть сделано с использованием (b), т. Е. Внешних ключей, потому что, если при каждом изменении записи в основной таблице (например, статус «В процессе» изменяется на «Работа начата»), все соответствующие записи будут автоматически обновляться, где бы они ни находились ссылки. Но моя проблема в том, что в моем приложении слишком много таблиц (более 70), и так много разных статусов / категорий / типов и т. Д., Поэтому поддержка такого количества таблиц становится головной болью.

Также, пожалуйста, предложите У меня должна быть одна таблица, которая содержит основную информацию для статуй, категорий, типов (и любых других, если требуется) с дополнительным полем, в котором указывается, что это за основная запись, или лучше иметь отдельные таблицы, как сейчас?

1 Ответ

0 голосов
/ 29 августа 2018

Текущий статус:

  • У вас есть более 70 таблиц.
  • Все таблицы имеют поля ссылок, такие как статус, категория, тип
  • Статус, категория, тип имеет основную таблицу

Метод наилучшей практики a) Поля состояния / категории / типа в основных таблицах должны быть полями типа varchar / text, представляющими значения из основных таблиц

  • Здесь вы должны применить 3 поля во всей таблице 70+ для статуса / категории / типа с помощью varchar(50)
  • Проблема: если значение мастер-таблицы изменится с «Выполняется» на «Работа началась», то здесь вам нужно выполнить обновление и применить запрос на обновление ко всем более 70 таблицам. (Update запрос для главной таблицы)
  • Производительность будет ниже, если вам нужно использовать условие where для поиска в этом поле

Метод наилучшей практики b) или они должны быть foreign keys (int)

  • Здесь вы должны применить 3 поля во всех 70+ таблицах для статуса / категории / типа с int типом данных
  • Вам нужно использовать left outer join 3 раза для каждой таблицы 70+, чтобы в select запрос

Пример:

Select myTable.*, tblMaster1.StatusName, tblMaster2.CategoryName, tblMaster3.TypeName
From myTable
LEFT OUTER JOIN tblMaster as tblMaster1 ON tblMaster1.MasterID = myTable.StatusIDF
LEFT OUTER JOIN tblMaster as tblMaster2 ON tblMaster2.MasterID = myTable.CategoryIDF
LEFT OUTER JOIN tblMaster as tblMaster3 ON tblMaster3.MasterID = myTable.TypeIDF
  • Приведенный выше запрос снизит производительность сервера sql

Метод наилучшей практики c) Примените 6 полей, 3 поля для foreign keys (int) и 3 поля для varchar(50) в основных таблицах.

  • Вам нужно написать Update запрос для мастер-таблицы при изменении значения, например, «Выполняется», на «Работа начата»
  • Но первое преимущество заключается в том, что вам не нужно использовать Join, чтобы получить соответствующее значение из мастер-таблицы
  • Вторым преимуществом является то, что в этой таблице тоже есть foreign keys, если вам нужно использовать объединение или запуск любого запроса или подзапроса, используя условие where в статусе / категории / типе, вам нужно использовать поле foreign keys, это будет улучшить производительность, потому что int тип данных
  • Третье преимущество: у вас будет свобода выбора (переключения) полей int или varchar(50) в соответствии с требованиями бизнес-логики.

Так что, по моему мнению, вы должны выбрать опцию c) , это будет полезно для долгосрочных выгод

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