【问题标题】:modeling 2 relationships A many B, A many C, where optionally B has many C and both with same A建模 2 个关系 A many B, A many C,其中可选 B 有很多 C,并且两者都具有相同的 A
【发布时间】:2014-07-06 23:42:00
【问题描述】:

我有一个具有 ClientName 属性的 Clients 表,该属性也是主键。

我有一个 Iterations 表,它有一个指向 ClientName 的外键和另一个名为 IterationId 的属性。 (ClientName, IterationId) 对是该表的主键。

必须存在第三个表,具有以下特征:

  1. ClientName 的外键,不可为空。
  2. IterationId,它是一个可为空的属性,应该是 Iterations 表的外键。

由于要求 2 还暗示使用 Iterations 表的 ClientName 属性的外键,所以第三个表应该至少有 3 个属性,即 (ClientName1, ClientName2, IterationId),其中 ClientName1 是Clients 表和 (ClientName2, IterationId) 是 Iterations 表的外键。此外,我需要始终保证 ClientName1 == ClientName2。

是否有适当的方法对这 3 个表进行建模以保证刚才描述的所有要求?

编辑: 在面向对象的世界中,我可以很容易地用以下方式建模:

public class Client{

public List<Iteration> Iterations;
public List<Entity3> ListOfEntity3;

}

public class Iteration{

public List<Entity3> ListOfEntity3;

[NotNull]
public Client ClientReference;
}

public class Entity3 {

[NotNull]
public Client ClientReference;


public Iteration IterationReference;//this can be null.

}

对于 Entity3 的每个实例 I,如果 I.IterationReference!=null 则 I.IterationReference.ClientReference == I.ClientReference。

我如何在关系世界中实现这一目标?

【问题讨论】:

    标签: sql sql-server database entity-framework relational-database


    【解决方案1】:

    您不需要将外键映射回表 3 中的表 1,由于表 3 中的外键映射回表 2,而表 2 有外键映射回表 1,因此在第三个表中,您只需要一个外键映射回表 2 和表 3 中的一些代理键,因此您可以让多个 C 引用回表 2 中的一条记录。

    【讨论】:

    • 我真的不明白...什么是“C”?
    • C 我指的是table3中的记录
    • 但是在这个解决方案中,如何将“C”映射回表 1?请注意,从“C”到表 2 的映射是可选的(外键可以为空)。
    • 这个table3记录映射回Table2,Table2映射回table1,所以Table3中的任何记录实际上都是通过table2映射回table1,不需要table3中的列直接引用回table1。
    • 恐怕我还是不明白。 table3 记录如何映射到 table1 记录而不映射到 table2 记录? (这是一个要求)
    相关资源