每个项目都有多个数据集(“项目”中的 currDataXXX 列)
这意味着从项目到数据集存在一对多的关系。因此,项目 ID 应该是数据集表上的外键,而 currDataXX 列应该从项目表中删除。(当前的设计代表了非规范化。)
完成此操作后,您现在在项目和用户之间拥有两种多对多关系 - 一种具有角色链接实体,另一种具有数据集链接实体。这种关系通常是多余的——在这种情况下,我假设 a) 只有在项目中具有角色的用户才能添加数据集,并且 b) 单个用户可以为单个项目添加许多数据集。
如果这两个假设都是正确的,那么从角色到数据集实际上是一对多的关系,因此角色 ID 应该是数据集表上的外键,而用户和项目 ID 在数据集表上变得多余,并且可以删除。像这样:
+----------+ +----------+ +----------+
| User +---<| Role |>---+ Project |
+----------+ +----+-----+ +----------+
|
/|\
+----------+
| Dataset |
+----------+
[如果假设 b) 不正确,那么角色和数据集可以合并到一个表中,而如果假设 a) 不正确,那么角色和数据集仍然是两个不同的链接实体,彼此无关。]
编辑 - 根据根瘤菌的编辑更新了拟议的结构:
+----------+
| Role |
+----+-----+
|
/|\
+----------+ +----------+ +----------+
| User +---<| Users/ |>---+ Project |
| | | Projects | | |
+----------+ +----+-----+ +----------+
|
/|\
+----------+
| Dataset |
+----------+