Core中的模型继承和数据库规范化

时间:2018-12-07 17:42:18

标签: c# inheritance entity-framework-core database-normalization

执行C#ASP.NET Core 2.1 MVC及其后续步骤以及Contoso教程,在这些教程中,您有一个Student模型和Instructor模型,这些模型继承自具有通用属性的People模型。迁移后,将形成带有“ Discriminator”字段的单个People表。

想要进行3NF标准化时,带有Discriminator的单个表是否可以接受?或者是否有一种方法,我仍然可以减少冗余代码,同时还可以为数据库管理员生成标准化的布局?

根据评论进行编辑:

这就是我喜欢堆栈溢出,思想和解释共享的地方。因此,这是我对3NF的解释,如果我错了,请分享您的解释,以便我学习。

public abstract class BaseModel
{
    public int ID { get; set; }
}

public abstract class Person : BaseModel
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

public class Student : Person
{
    public DateTime EnrollmentDate { get; set; }
}

public class Instructor : Person
{
    public DateTime HireDate { get; set; }
}

结果是一个单独的“人”表,如下所示: ID |姓氏|名|鉴别器|雇用日期|注册日期

判别器是NVARCHAR(MAX),或者换句话说,将是“教师”或“学生”的字符串

因此,鉴别器将具有冗余值,这些值应该在自己的表中并使用整数外键。

也存在传递依赖项,因为Student确定EnrollmentDate但与HireDate无关,反之则与Instructor有关。因此,任一日期列也不属于该表,并且我认为该表甚至不能满足2NF的要求。

我相信一组适当规范化的表将是这样的:

-人- ID |姓氏|名字

-学生- 人名|注册日期

-讲师- 人名|聘用日期

OR

-学生- ID |姓氏|名|入学日期

-讲师- ID |姓氏|名|聘用日期

所以回到原始的帖子和问题,是一个“主”表,带有一个“鉴别符”列是否可以正常化,因为目标应该是数据库管理员的正确结构化表,并同时删除数据库的冗余属性程序员担心编写格式和验证以及错误消息。第二点,请分享其他解决方案,例如是否可以在DTO或ViewModels中完成数据验证。

1 个答案:

答案 0 :(得分:0)

解决方法是删除单行

型号:

_transList.clear()

DbContext:

public abstract class BaseModel
{
    public int ID { get; set; }
}
public abstract class BasePerson
{
    public string LastName { get; set; }
    public string FirstName { get; set; }
}
public class Student
{
    public DateTime EnrollmentDate
}
public class Instructor
{
    public DateTime HireDate
}

如果像Contoso教程所示那样包含People DbSet,则在执行迁移和更新数据库时,您将在数据库中获得一个People表,在所有继承的字段之后,该字段的名称为Discriminator,其值将为学生或讲师,以及表格末尾的任何唯一字段。

在我看来,BaseModel中没有一个Model表,因为DbContext中没有DbSet Models。因此,我尝试了一下,它成功了,删除了DbSet People的行,您得到的是带有所有继承字段的学生和讲师的单独表。