建模2关系A很多B,A很多C,其中任选B有许多C,两者都有相同的A.

时间:2014-07-06 23:42:01

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

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

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

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

  1. ClientName的外键,不可为空。
  2. 一个IterationId,它是一个可以为null的属性,应该是Iterations表的外键。
  3. 由于需求2意味着还使用了Iterations表的ClientName属性的外键,因此第三个表应至少具有3个属性,即(ClientName1,ClientName2,IterationId),其中ClientName1是外键的客户端表和(ClientName2,IterationId)是迭代表的外键。此外,我需要始终保证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.IterationReference!= null,则I.IterationReference.ClientReference == I.ClientReference。

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

1 个答案:

答案 0 :(得分:0)

你不需要将一个外键映射回到table3中的table1,因为你在table3中有一个外键映射回Table2而Table2有一个外键映射回到Table1,在你的第三个表中你需要的只是一个外键映射回Table2和表3中的一些代理键,因此您可以将多个C引用回表2中的一条记录。