在数据库中的模型中的抽象基类和亚类(model an abstract base class and

2019-08-07 23:34发布

我有4个亚类: VideoImageNote ,和Form 。 各包含不同的数据类型。 例如, Image类包含在磁盘上和图片属性的图像文件的路径,并且所述Form类包含表单字段值。 每个项之间的共同元件,但是,是GPS坐标和航向,因此我有以下的抽象基类:

public abstract class Content
{
    public float? Latitude { get; set; }
    public float? Longitude { get; set; }
    public float? Heading { get; set; }
}

然而,当我得到朦胧的是如何在一个数据库建模。 目前,我有一个表称为Events (例如起见,假设一个事件是党的生日)和4个表( VideosImagesNotesForms )。 每个表都有一个外键链接回Events “的主键。

使用LINQ到SQL,我得到5班为每个表。 这是好的,如果我只想要一个类型的数据,例如Event.Images ,但我想做的是统计的“内容”的总数Event有,并获得GPS坐标。 我能翼伯爵只要使用很容易Event.Images.Count() + Event.Videos.Count() + ... ,但我不能对GPS坐标做同样的。 有一些方法可以让我的数据库模型,以便我可以用一个基类的每个项目,仍然能够获得单个强类型的项目,当我需要看它的数据?

Answer 1:

这有在企业应用架构,每一个不同的取舍Martin Fowler的模式记录三种不同的模式:

  • 单表继承
  • 类表继承
  • 混凝土表继承


Answer 2:

这是做这件事。

一般来说,还有其他两种方法:

  • 而不是试图共享基类在数据库中,只需创建为每一个独立的表:每个子类表。

  • 每一个分层表:把所有的字段的超集到表,以及一个“鉴别”一栏,并将其存储在一个地方。

为了弄清楚哪些是对的,想想使用模式:

  • 如果你通常单独地处理它们,并独立地查询,单独的表是go--一个很好的方式要么你有什么或每个子类表。
  • 如果这些异类集合处理,所以你要在他们看起来像这样,一个表可以更容易

也看看你的工具最自然的支持。 他们所有的工作。



Answer 3:

看看这些例子SO,它可能是有益的。



Answer 4:

事实上,这个确切的问题被问了一个可怕的很多,并且已经回答了很多次 。 你可能还没有开始使用数据库术语搜索。

问题是施加OO术语和在非对象被摄体区域思维; 做一个普通的简单的任务非常复杂的和有限的。

Martin Fowler的和Scott Ambler的书是不值得一美元的很多人,在细节这个答案 ,开始于10年12月11日入境。



文章来源: model an abstract base class and subclasses in a database