如何创建嵌套的:实体框架中的许多关系?

时间:2014-09-01 02:53:54

标签: .net sql-server entity-framework azure azure-sql-database

所以我有一个由我们的DBA设置的架构,现在我需要将它转换为SQL Azure。我在尝试将其转换为我们的Azure移动服务的.NET后端时遇到了一些麻烦。这是架构:

Schema diagram

所有这些都是一对多的关系。因此,您会注意到有多个外键关联多个表。例如,在Scenario表中,有一个项目表和区域表的外键。这是设置数据库的好方法吗?难道你不能将表关联到指向父表的指针吗?例如,在Scenarios表中,FK只能使用SubAreas?起初我尝试在我的Azure服务中创建EntityData类,如下所示:

public class SubArea : EntityData 
{
    public string SubAreaAttenuation {get; set;}
    ...
    ...
    public virtual Area Area {get; set;}

    public virtual ICollection<Scenario> Scenarios {get; set;}
}

我是否需要SubArea中的区域和项目的显式键?或者是指向区域的指针够了吗?我觉得DBA有这些额外的密钥是有原因的(可能会让搜索变得更容易吗?)但是我对数据库知之甚少还不确定。

2 个答案:

答案 0 :(得分:1)

糟糕的设计,有两个原因:

  1. 将有意义的值作为主键是一个错误的决定。您的DBA应该知道,如果项目名称应该更改一天,则需要对所有涉及的表进行表重建,因为不能只修改主键值。

  2. 您的DBA也应该知道这不是很好的标准化设计,因为所有这些关键值都是多余的。规范化的想法是减少冗余。如果Area需要知道其Project的名称,则应加入Project。 RDBMS针对这些类型的反向连接进行了极好的优化。

  3. 应删除所有这些复合键。主键应该是单数值,这些值与业务逻辑无关,因此它们可以是不可变的(所谓的代理键 - 考虑这些是{学术特权} { {3}})。使用复合键编写连接是一个PIA。即使使用EF为您生成查询,也更容易使用单个主键。

    如果任何字段组合应该是唯一的,则应该应用唯一索引,可能是群集。默认情况下,主键是聚类的,但在设计表时,可以选择另一个索引作为聚簇索引。这是anti pattern的内容。

答案 1 :(得分:0)