Что бы уловить суть вопроса ситуация такова.
- есть пользователи
- есть проекты созданные пользователями
- есть задания для проектов упомянутых выше
---------------- - users --- id - projects --- id
--- id_user
--- title - tasks --- id
--- id_project
--- message
--- id_user (?)
--------------------------
Ранее работая с чужими кодами (в итоге перенял себе) я замечал что что везде где пользователь что то создаёт там присутствует поле id_user, и это понятно, но если есть промежуточная таблица с этим полем (в моём случае projects) то в tasks(что бы было всё по феншую) это поле уже добавлять не нужно получается (или это уже не феншуй?)
При выборке сtasks у нас есть id_project, по нему мы можем узнать в таблице projects наш заветный id_user. tasks.id_project связан c projects.id projects.id_user связан с users.id
Вроде всё элементарно, но зачем тогда создают id_user в обеих таблицах, всё равно данные в этих полях будут одинаковы (в id_user), а если разные то это уже есть ошибки в приложении.
По феншую не нужно.
Если заведете user_id в задачах, то появляется не нулевая вероятность рассинхронизации project.user_id и tasks.user_id. И нужно будет этот момент как-то отлавливать.
но зачем тогда создают id_user в обеих таблицах, всё равно данные в этих полях будут одинаковы
Чтоб не включать в запрос таблицу project и сразу выходить на пользователей. Типа немного быстрее, но на деле создает дополнительные возможности для ошибок.
res2001: я раньше внешние ключи не использовал, и на автопилоте лепил id_user везде где можно, а тут сел создавать таблицы, принялся за внешние ключи и призадумался зачем мне лишний id_user если без него можно обойтись к тому же в нём таится потенциально возможная ошибка. Спасибо за ответ.
Александр Шаповал: Погодите. Поле лишнее только в той ситуации, когда задачи по проекту может создавать только пользователь, создавший проект. Обычно же в проекте может создавать задачи любой другой пользователь.
но зачем тогда создают id_user в обеих таблицах, всё равно данные в этих полях будут одинаковы (в id_user), а если разные то это уже есть ошибки в приложении.
res2001: да, верно, но под имеет место быть я подразумевал что это не всегда ошибка как может показаться на первый взгляд, но зачастую все таки в коде что я видел, это была ошибка
Это имеет смысл, если в проекте учавствуют несколько пользователей, и каждый из них занят одной задачей. Если в одном проекте только один пользователь, то не надо.