在数据库中建模抽象基类和子类

时间:2009-09-19 04:02:44

标签: linq-to-sql database-design abstract-class

我有4个子类:VideoImageNoteForm。每个包含不同类型的数据。例如,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-to-SQL,我为每个表获得5个类。如果我只想要一种类型的数据(例如Event.Images),这很好,但我想要做的是计算Event的“内容”总数并获取GPS坐标。我只需使用Event.Images.Count() + Event.Videos.Count() + ...即可轻松完成计数,但我不能对GPS坐标做同样的事情。我是否可以通过某种方式对数据库进行建模,以便我可以为每个项目使用基类,并且在需要查看其数据时仍然可以获取单独的强类型项目?

4 个答案:

答案 0 :(得分:8)

Martin Fowler的企业应用程序架构模式中记录了三种不同的模式,每种模式都有不同的权衡:

答案 1 :(得分:1)

这是一种方法。

一般来说,还有另外两种方式:

    每个子类的
  • 表:不是尝试在数据库中共享基类,而是为每个子类创建单独的表。

  • 每个层次结构的表:将所有字段的超集放入表格,以及“鉴别器”列,并将它们存储在一个位置。

要弄清楚哪个是正确的,请考虑使用模式:

  • 如果你通常独立地对待它们,并且独立查询,那么单独的表是一个很好的方法 - 你拥有的或每个子类的表。
  • 如果将这些视为异构集合,那么您希望以这样的方式查看它们,单个表格可以更容易

另请参阅您的工具最自然支持的内容。他们都工作。

答案 2 :(得分:0)

看看这些SO示例,它可能会有所帮助。

答案 3 :(得分:-2)

实际上,这个确切的问题被问到了很多,并且一直是answered many times。您可能没有使用数据库术语进行搜索。

问题在于在非对象主题领域应用OO术语和思考;使一项普通的直接任务非常复杂和有限。

Martin Fowler和Scott Ambler的书籍对于他们中的很多书都不值一美元,this answer中的详细信息,从 11月10日条目开始。