Проектирование БД. Хранение путей к файлам в одной таблице или в нескольких

117
02 апреля 2021, 23:50

Собираю базу данных. Задача найти оптимальное (наиболее производительное) решение модели базы.

Дано:

  • таблица с сотрудниками "hrms_employees";
  • каждый сотрудник имеет паспорт (таблица "hrms_passports"), сертификаты (таблица "hrms_certificates"), образование (таблица "hrms_educations");
  • документов у каждого сотрудника может быть несколько (2 сертификата, 3 диплома образования и тд);
  • каждый документ сканируется и загружается в систему, пути к документам сохраняем в таблице "hrms_docs_paths";
  • Таблица "hrms_docs_paths" связанна с "hrms_passports" таблицей "hrms_passports_docs_paths" отношением многие ко многим. Аналогичная ситуация с "hrms_certificates" и "hrms_educations" (см. модель ниже).

Вопрос:

Оптимальное ли данное решение связей с точки зрения производительности, либо лучше отказаться от таблиц "hrms_passports_docs_paths", "hrms_сertificates_docs_paths", "hrms_educations_docs_paths" в пользу хранения всех путей напрямую в таблице "hrms_docs_paths" с добавлением двух индексов: id_document (ключ в основной таблице документов) и type (passport, education, certificate)?

Текущая реализация:
(На типы данных не обращайте внимание, сейчас набрасывается общая модель.)

Answer 1

Одна таблица для сканов, одно поле типа enum для типа скана (или отдельная таблица с типами, если они будут динамические и пополняемые).

И, главное, не хранить пути к файлам в базе. Каждый скан так или иначе имеет уникальные признаки - идешка, тип, владелец. Дата создания на худой конец или контрольная сумма от файла. Всего этого достаточно для генерации путей до файла.

Завтра поменяете способ хранения файлов и придётся обновлять все записи в базе? Нет, только поменяете генератор путей. Плохая идея хранить весь миллион файлов в одной папке. Вы всё равно рано или поздно придёте к шардированию в том или ином виде. Базы это никак касаться не должно.

Answer 2

Предложу свой вариант.

Создайте 3 таблицы.

  1. hrms_employees
  2. hrms_docs_paths
  3. hrms_docs_type

1 и 2 таблицу свяжите общим ключом, возможно это будет какой-либо ID или номер табеля сотрудника в организации.

2 и 3 таблицы свяжите id_type

В конечном итоге запрос по сотруднику условно говоря будет такого вида

SELECT empl.*, doc.passport, doc.certificates FROM hrms_employees empl
JOIN hrms_docs_paths doc
ON doc.id_empl = empl.id_empl
WHERE empl.name = 'Иванов'

Если хотите выводить название документа, в запрос вкладываете JOIN по hrms_docs_type, где будет 2 стобца: id_type, type_name

С точки зрения проектирования такой вариант будет предпочтительней, чем для каждого типа документа создавать отдельную базу.

READ ALSO
Смена значения даты по умолчанию в MySQL

Смена значения даты по умолчанию в MySQL

В MySQL таблице нужно сменить значение по умолчанию

102
Как перенести информацию из локальной базы данных с одного компьютера на другой?

Как перенести информацию из локальной базы данных с одного компьютера на другой?

После покупки нового компьютера (доступ к старому есть ещё есть), нужно перенести на него информацию из базы данных которая у меня там была...

144
Mysql, AUTO_INCREMENT

Mysql, AUTO_INCREMENT

Вопрос такой, я создаю таблицу в нем будет

139
WordPress добавление в метаданные пост тайпа

WordPress добавление в метаданные пост тайпа

Только осваиваю WordPress, есть кастомный пост тайп

99