Собираю базу данных. Задача найти оптимальное (наиболее производительное) решение модели базы.
Дано:
Вопрос:
Оптимальное ли данное решение связей с точки зрения производительности, либо лучше отказаться от таблиц "hrms_passports_docs_paths", "hrms_сertificates_docs_paths", "hrms_educations_docs_paths" в пользу хранения всех путей напрямую в таблице "hrms_docs_paths" с добавлением двух индексов: id_document (ключ в основной таблице документов) и type (passport, education, certificate)?
Текущая реализация:
(На типы данных не обращайте внимание, сейчас набрасывается общая модель.)
Одна таблица для сканов, одно поле типа enum для типа скана (или отдельная таблица с типами, если они будут динамические и пополняемые).
И, главное, не хранить пути к файлам в базе. Каждый скан так или иначе имеет уникальные признаки - идешка, тип, владелец. Дата создания на худой конец или контрольная сумма от файла. Всего этого достаточно для генерации путей до файла.
Завтра поменяете способ хранения файлов и придётся обновлять все записи в базе? Нет, только поменяете генератор путей. Плохая идея хранить весь миллион файлов в одной папке. Вы всё равно рано или поздно придёте к шардированию в том или ином виде. Базы это никак касаться не должно.
Предложу свой вариант.
Создайте 3 таблицы.
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
С точки зрения проектирования такой вариант будет предпочтительней, чем для каждого типа документа создавать отдельную базу.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей