2009-09-19 63 views
5

我有4个子类:Video,Image,NoteForm。每个包含不同类型的数据。例如,Image类包含磁盘上图像文件的路径和图像属性,并且Form类包含表单字段值。各项目之间的共同元素,但是,GPS坐标和航向,所以我有以下的抽象基类:模拟抽象基类和数据库中的子类

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

然而,使人感到困惑的是如何在数据库建模。目前我有一个名为Events(举例来说,假设一个事件是生日派对)和一个表格(Videos,Images,NotesForms)。每个表都有一个连接到Events主键的外键。

使用LINQ-to-SQL,我为每个表获得5个类。这很好,如果我只想要一种类型的数据,例如Event.Images,但我想要做的是统计Event拥有的“内容”的总数并获取GPS坐标。我只需使用Event.Images.Count() + Event.Videos.Count() + ...即可轻松完成计数,但我无法对GPS坐标进行相同操作。有什么方法可以模拟数据库,以便我可以为每个项目使用基类,并且在需要查看其数据时仍能够获取单个强类型项目?

回答

8

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

+0

感谢您的链接。他们对如何使用这些模型并没有给出很好的描述,但它给了我一个做更多研究的起点。就我个人而言,我一直认为单表模型是一个坏主意,因为这意味着如果您添加一个新的子类,则必须为其数据添加新列,并且可能会膨胀到不合需要的大小,尽管对于较小的应用程序,我可以看到使用它的优点。 – 2009-09-21 21:58:22

+0

雅,有一定的权衡。这只取决于添加新类型的可能性。如果不太可能,最好避免遍历多个表并使用单个表。如果可能的话,其他模式之一。而且,是的,这些链接相当稀少,因为他们希望你购买这本书:-)这是一本好书 - 值得我思考。 – SingleShot 2009-09-21 22:02:54

1

那是做到这一点的一种方法。

一般来说,还有其他两种方法:每个子类

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

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

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

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

也看到你的工具最自然的支持。他们都工作。

+0

感谢您的回复。事实证明,无论如何我需要改变整个领域模型,所以我的问题可以自行修正,可以这么说。 – 2009-09-21 22:01:09

-2

其实,这个确切的问题被问了很多,并已被answered many times。您可能没有使用数据库术语进行搜索。

问题是在非客体主题领域应用面向对象的术语和思维;使一项普通的直接任务非常复杂和有限。

Martin Fowler的和Scott Ambler的书是不值得一美元的很多人,细节this answer,开始在10年12月11日条目。

+6

-1,我在2009-09-19问了这个问题,在链接的文章创建之前。你的回答根本不是一个答案,而是对我和这个行业中两位备受尊敬的个人的侮辱。 – 2011-01-10 19:36:17

+2

@Daniel。这个线程不断出现在其他(当前)线程上,这就是我如何找到它的。对不起,我没注意到它是从2009年开始的。没有侮辱你的意图。福勒和安布勒有很多要回答。我很乐意回答具体的问题,但是不可能对Fowler/Ambler或你的感觉作出回应(例如,什么是“侮辱”?) – PerformanceDBA 2011-01-11 05:18:38