Плохо ли иметь "избыточность внешнего ключа" в базе данных?

Я проектирую структуру базы данных со следующим упрощенным примером:

Team has many members
Member has many clients
Client has many projects

Предполагая, что мои объекты имеют следующие параметры:

Team: id, type
Member: id, team_id, name
Client: id, member_id, email
Project: id, client_id

Это достаточно просто, чтобы найти клиента проекта или члена клиента или членов группы.

Однако, предполагая, что я хочу найти команду проекта, например, я должен сначала найти клиента проекта, затем члена клиента, а затем членов группы.

Я мог бы добавить team_id непосредственно в проект, например:

Project: id, client_id, team_id

Я понимаю, однако, это добавляет определенный уровень избыточности, поскольку эта информация доступна, "поднимая дерево отношений". Это плохая идея?

Спасибо!

Ответ 1

Является ли это плохой идеей или нет, зависит от типичных случаев использования базы данных.

Добавление дополнительных внешних ключей увеличивает стоимость модификации структуры (INSERT, UPDATE при изменении отношений, DELETE).

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

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

Ответ 2

Не похоже, что вам нужно сделать 4 запроса здесь. Вы просто выполняете объединение, которое объединяет все таблицы в одном запросе. Это не добавляет много сложности, но это немного добавляет. Я бы просто пошел с тем, что у вас есть.