Полезно ли хранить столбец num_of_x в таблицах SQL? - PullRequest
0 голосов
/ 30 апреля 2020

Рассмотрим пример:

База данных, предназначенная для хранения информации отдела в компании:

  • В отделе кадров пять сотрудников.
  • Существует две таблицы: Департамент и Сотрудники

Часто вы используете sh, чтобы узнать, сколько сотрудников работает в отделе x. Есть два способа узнать количество сотрудников: один хранит его в столбце, другой ищет счет в таблице сотрудников

У меня такой вопрос:

Имеет ли смысл хранить столбец num_of_employees в таблице Department?

Вот мои взгляды:

  • Это будет немного головной боли, чтобы всегда сохранять значение счетчика в столбцах num_of_ синхронизированным с фактическим числом в другой таблице (требуются триггеры при вставке, удалении)
  • В случае, когда фактически требуется только количество сотрудников : Запрос будет значительно быстрее (поскольку ему вообще не нужно будет делать count(*) для другой таблицы)

Теперь вышеприведенная версия была довольно упрощенной версией реальной проблемы, которую я иметь десятки взаимосвязанных таблиц, с частыми запросами случаев использования, где я спрашиваю, где X = (некоторое значение) в таблице 1, сколько соответствующих строк (через внешний ключ) у него есть в таблице 2, таблице 3 и и так далее.

Итак, когда полезно иметь в таблице num_of_x столбцы? Описанный выше вариант использования считается хорошей ситуацией, когда его следует использовать (или нет)?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Имеет ли смысл хранить столбец num_of_employees в таблице Department?

Это избыточность . Избыточность может иметь:

  • Преимущества: Избыточность может быть полезна, когда вычислять значение каждый раз дорого. Таким образом, вы просто получаете значение без какой-либо дополнительной задержки.

  • Недостатки: избыточность сохраняет одно и то же значение, повторенное несколько раз в базе данных. Это может привести к несоответствиям или к устареванию некоторых значений.

В вашем конкретном случае я думаю, что выгоды будут небольшими (дешевыми для вычисления значения) со значительными недостатками (показывая устаревшие) /неправильное значение). Учитывая это, я бы [лично] не использовал избыточность для этого случая.

0 голосов
/ 30 апреля 2020

Количество сотрудников в отделе можно легко рассчитать с помощью:

select count(*)
from employees e
where e.department_id = ?;

При индексе department_id это должно быть довольно быстро и всегда актуально.

Ведение запросов на центральном столе быстрее для запросов. Однако для него требуется наличие триггеров для insert s, update s и delete s в таблице `employee - триггеры, которые замедляют операции DML.

В большинстве случаев просто используйте запрос рассчитать стоимость. Если производительность является проблемой, рассмотрите более экстремальные решения, такие как предварительный расчет значения.

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