我有4个子类:Video
,Image
,Note
和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个表(Videos
,Images
,Notes
和Forms
)。每个表都有一个链接回Events
'主键的外键。
使用LINQ-to-SQL,我为每个表获得5个类。如果我只想要一种类型的数据(例如Event.Images
),这很好,但我想要做的是计算Event
的“内容”总数并获取GPS坐标。我只需使用Event.Images.Count() + Event.Videos.Count() + ...
即可轻松完成计数,但我不能对GPS坐标做同样的事情。我是否可以通过某种方式对数据库进行建模,以便我可以为每个项目使用基类,并且在需要查看其数据时仍然可以获取单独的强类型项目?
答案 0 :(得分:8)
Martin Fowler的企业应用程序架构模式中记录了三种不同的模式,每种模式都有不同的权衡:
答案 1 :(得分:1)
这是一种方法。
一般来说,还有另外两种方式:
表:不是尝试在数据库中共享基类,而是为每个子类创建单独的表。
每个层次结构的表:将所有字段的超集放入表格,以及“鉴别器”列,并将它们存储在一个位置。
要弄清楚哪个是正确的,请考虑使用模式:
另请参阅您的工具最自然支持的内容。他们都工作。
答案 2 :(得分:0)
答案 3 :(得分:-2)
实际上,这个确切的问题被问到了很多,并且一直是answered many times。您可能没有使用数据库术语进行搜索。
问题在于在非对象主题领域应用OO术语和思考;使一项普通的直接任务非常复杂和有限。
Martin Fowler和Scott Ambler的书籍对于他们中的很多书都不值一美元,this answer中的详细信息,从 11月10日条目开始。