将三元关系分解为二元关系

时间:2012-05-15 09:19:11

标签: database-design entity-relationship

我正在设计一个数据库来处理具有以下关系和约束的用户,帐户和项目:

  • 帐户有很多用户
  • 用户属于多个帐户
  • 一个帐户有很多项目
  • 项目属于一个帐户
  • 用户在许多项目中进行协作(多余注释:每个项目都属于自己的帐户)。

换句话说,用户可以在同一帐户的许多项目中进行协作。但由于用户可以属于多个帐户,因此用户可以在多个帐户的许多项目中进行协作。这使我得到了一个三元合作关系:

enter image description here

在阅读了几篇关于将三元关系转换为二元关系的论文之后,我提出了以下等价关系:

enter image description here

这里出现了两个问题:

  1. 此转换是否正确?我发现我必须在应用程序级别添加额外的检查来处理插入。例如,在添加新(User,Project)之前,我必须检查用户是否属于项目所属的同一帐户。

  2. 是否真的有必要建立AccountUser之间的关系?添加UserProject之间的关系后,我们无法通过访问项目来了解用户所属的帐户吗?

  3. 谢谢!

1 个答案:

答案 0 :(得分:12)

  

这种转换是否正确?

如果“正确”表示“等效”,则为“

如果没有连接用户(等等),没有什么可以阻止你连接项目和帐户,这在真正的三元关系中是不可能的。

  

是否真的有必要建立帐户和用户之间的关系? ...通过访问项目,我们无法知道用户所属的帐户吗?

实际上,我们只知道哪些帐户是“候选人”与用户连接,但我们没有办法选择一个。

此方案的真正问题在于,它允许您将用户连接到与任何用户项目无关的帐户。


在我看来,如果您需要三元关系,请继续直接在物理模型中表示。如果我正确理解您的要求,这将是这样的:

enter image description here

请注意AccountIdCollaboration PK之外的情况。这意味着每个项目/用户组合必须只连接到一个帐户(不同的组合仍然可以连接到其他帐户)。