@an23

Как правильно построить архитектуру БД?

Добрый день. Есть следующая задача: существуют сущности User и Event(к примеру какой-то концерт). У User есть avatar, у Event есть preview, т.е. и там и там необходима связь с файлом, по большому счету 1:1.
Была создана таблица File, и вот тут начинаются проблемы. Непонятно как правильно связать таблицы между собой. Пока добавил в файл поля типа id_user, id_event, который будут идентифицировать связанную сущность, соответственно, если файл связан с пользователем, то в id_event должно быть NULL. Насколько это верно? И возможно вы могли бы подсказать более элегантное и правильное решение.
280c63e3386d4a7780f449ee3ce524ab.png

Также я понимаю, что можно просто сделать 2 таблицы, типо user_files и event_files - но по моему это вообще глупость. Спасибо!
  • Вопрос задан
  • 2710 просмотров
Решения вопроса 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
В таблицах Event и User должно быть по строковому полю - имя файла. И всё. Городить же дополнительные таблицы - это бессмысленно усложнять ту самую архитектуру БД.

Если уж тебе так хочется сделать централизованное хранилище картинок - делаешь в Event и User по полю file_id, ссылающихся на таблицу File. Но никаких ссылок на Event и User в таблице File вообще быть не должно. Тебе надо выбрать картинку при отображении записи - это делается связью из Event/User к File. Для каких задач тебе может потребоваться связь в обратную сторону?

N.B. Чтобы определить - принадлежит ли файл пользователю - не требуется связь из File к User, достаточно связи из User к File.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ну вопервых это не глупость, в рамках задачи очень даже нормально, так как File слишком общая штука. А если вам понадобится сделать связь многие ко многим еще к одной таблице? Или превью для ивента станет несколько?

Короче либо делайте две разные таблицы, либо заводите одну общую и связывайте их через many-to-many. Либо да, одна таблица с полем type и двумя порейдж кеями на таблицы event и user.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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