Каждый проект имеет несколько наборов данных (столбцы currDataXXX в «проектах»)
Это означает, что существует взаимосвязь «один ко многим» от проекта к набору данных.Таким образом, идентификатор проекта должен быть внешним ключом в таблице набора данных, а столбцы currDataXX должны быть удалены из таблицы проекта.(Текущий дизайн представляет собой денормализацию.)
Сделав это, теперь у вас есть два отношения «многие ко многим» между проектом и пользователем - одно с сущностью связи ролей, а другое с сущностью связи набора данных.,Такие отношения обычно избыточны - в этом случае я бы предположил, что а) только пользователи с ролью в проекте могут добавлять наборы данных, и б) что один пользователь может добавить множество наборов данных для одного проекта.
Если оба эти предположения верны, то фактически существует отношение один ко многим от роли к набору данных, и поэтому идентификатор роли должен быть внешним ключом в таблице набора данных, в то время как идентификаторы пользователя и проекта становятся избыточными в таблице набора данных имогут быть удалены.Например:
+----------+ +----------+ +----------+
| User +---<| Role |>---+ Project |
+----------+ +----+-----+ +----------+
|
/|\
+----------+
| Dataset |
+----------+
[Если предположение b) неверно, то роль и набор данных могут быть объединены в одну таблицу, в то время как если предположение а) неверно, то роль и набор данных остаются двумя различными связующими объектами, не связаннымидруг другу.]
РЕДАКТИРОВАТЬ - обновлена предлагаемая структура, после правок Ризоза:
+----------+
| Role |
+----+-----+
|
/|\
+----------+ +----------+ +----------+
| User +---<| Users/ |>---+ Project |
| | | Projects | | |
+----------+ +----+-----+ +----------+
|
/|\
+----------+
| Dataset |
+----------+