2009-09-19 58 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