asp.net mvc-application 中层次树的实体设计
Which entity design for hierarchy tree in asp.net mvc-application
我只是无法决定选择哪种方法才能拥有具有部分不同对象类型的层次结构树。该应用程序是 Asp.Net MVC,我首先使用 entity framework 代码。我的层次树是一个信息内容结构。树中的每个节点都可以是我实现的三种类型之一。
目前,Table-per-type (TPT) 似乎是我最好的设计选择,但是你觉得怎么样?我选择的设计有什么缺点吗?例如,基 class 是否应该有一个鉴别器字段?
为了说明,下面是我当前设计的伪示例。
此致,克拉斯·埃里克森
public abstract class PageObject
{
public int ID { get; set; }
public int? ParentID { get; set; }
public string Title { get; set; }
public virtual PageObject Parent { get; set; }
public virtual ICollection<PageObject> Children { get; set; }
}
[Table("LinkPage")]
public class LinkPage : PageObject
{
public string Url { get; set; }
}
[Table("FramedPage")]
public class FramedPage : LinkPage
{
public int? MinHeight { get; set; }
public int? MinWidth { get; set; }
}
[Table("ContentPage")]
public class ContentPage : PageObject
{
[DataType(DataType.Html)]
[AllowHtml]
public string Content { get; set; }
}
public class InheritanceMappingContext : DbContext
{
public DbSet<PageObject> PageObjects { get; set; }
}
Should the base class have a discriminator field, for example?
您不必在使用这些方法中的任何一种时明确声明它。当使用 TPH 方法时,鉴别器字段将被 Entity Framework 自动添加为 table 字段,因为它将所有内容存储在 1 table 中,并且该字段充当 [=24= 指向的指针] 这张唱片属于。
For now, Table-per-type (TPT) seems to be my best choice of design but
what do you think?
你应该意识到,这完全是基于意见的问题,而且它取决于你的需要。每种方法都有其优点,反之亦然。
TPH 将为您提供最佳性能,因为所有数据都是通过 1 个查询选择的,没有任何 JOINS,但它要求 subclasses 中的属性在数据库中为 Nullable。 TPH 也违反了第三范式(性能价格)
TPT 策略的主要优点是 SQL 模式已规范化,但对于复杂的 class 层次结构,性能可能无法接受table,因为查询总是需要跨许多 tables
http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx
我只是无法决定选择哪种方法才能拥有具有部分不同对象类型的层次结构树。该应用程序是 Asp.Net MVC,我首先使用 entity framework 代码。我的层次树是一个信息内容结构。树中的每个节点都可以是我实现的三种类型之一。
目前,Table-per-type (TPT) 似乎是我最好的设计选择,但是你觉得怎么样?我选择的设计有什么缺点吗?例如,基 class 是否应该有一个鉴别器字段?
为了说明,下面是我当前设计的伪示例。
此致,克拉斯·埃里克森
public abstract class PageObject
{
public int ID { get; set; }
public int? ParentID { get; set; }
public string Title { get; set; }
public virtual PageObject Parent { get; set; }
public virtual ICollection<PageObject> Children { get; set; }
}
[Table("LinkPage")]
public class LinkPage : PageObject
{
public string Url { get; set; }
}
[Table("FramedPage")]
public class FramedPage : LinkPage
{
public int? MinHeight { get; set; }
public int? MinWidth { get; set; }
}
[Table("ContentPage")]
public class ContentPage : PageObject
{
[DataType(DataType.Html)]
[AllowHtml]
public string Content { get; set; }
}
public class InheritanceMappingContext : DbContext
{
public DbSet<PageObject> PageObjects { get; set; }
}
Should the base class have a discriminator field, for example?
您不必在使用这些方法中的任何一种时明确声明它。当使用 TPH 方法时,鉴别器字段将被 Entity Framework 自动添加为 table 字段,因为它将所有内容存储在 1 table 中,并且该字段充当 [=24= 指向的指针] 这张唱片属于。
For now, Table-per-type (TPT) seems to be my best choice of design but what do you think?
你应该意识到,这完全是基于意见的问题,而且它取决于你的需要。每种方法都有其优点,反之亦然。
TPH 将为您提供最佳性能,因为所有数据都是通过 1 个查询选择的,没有任何 JOINS,但它要求 subclasses 中的属性在数据库中为 Nullable。 TPH 也违反了第三范式(性能价格)
TPT 策略的主要优点是 SQL 模式已规范化,但对于复杂的 class 层次结构,性能可能无法接受table,因为查询总是需要跨许多 tables
http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx