我正在創建服裝店,因此我正在創建包含兩種類型的圖庫功能:產品庫和展示圖庫。產品畫廊只是單一產品的圖片,而畫冊庫就是包含多種產品的圖片。MySQL中的類層次結構
到目前爲止我我有一個簡化的UML圖有點像這個
我不知道該怎麼翻譯成MySQL表這一點。我試過,我想出了這樣的事情
但似乎有點小題大做,氣味風趣給我。在我的情況下最好的做法是什麼?我在正確的軌道上還是我的方式錯了?
我正在創建服裝店,因此我正在創建包含兩種類型的圖庫功能:產品庫和展示圖庫。產品畫廊只是單一產品的圖片,而畫冊庫就是包含多種產品的圖片。MySQL中的類層次結構
到目前爲止我我有一個簡化的UML圖有點像這個
我不知道該怎麼翻譯成MySQL表這一點。我試過,我想出了這樣的事情
但似乎有點小題大做,氣味風趣給我。在我的情況下最好的做法是什麼?我在正確的軌道上還是我的方式錯了?
我不知道「最佳實踐」是什麼,你可以使用NO-SQL數據庫,或者如果你使用關係數據庫,你可以使用3個表格,畫廊,圖片和產品。
畫廊可以包含多個圖片
圖片可以包含多個產品。
畫廊類型之間的區別只包含在屬性中。
該數據庫模式看起來像註定要失敗。定義模式時最重要的事情是從問題的名詞和動詞開始。用文字描述你的環境是什麼樣的。那裏有什麼實體?這些實體如何相互影響?例如,「畫廊有圖片」。僅此陳述告訴你,畫廊和圖片之間存在關聯。
一旦你想出你的名詞動詞關聯,你可以開始說明像「畫廊」和「圖片」這樣的實體。畫廊和圖片之間是否存在一對一的關係,或者是否有一個畫廊與許多圖片?
想起這些事,看看這裏的一些基本設計提示:http://msdn.microsoft.com/en-us/library/b42dwsa3(v=vs.71).aspx
首先考慮是否繼承是實現你需要的行爲的最好辦法。一般最好到prefer composition over inheritance。從你的圖中我會說,你根本不需要繼承來解決你的問題。
如果您確實需要實現繼承,那麼您可以使用多種策略。尋找一個對象關係映射器是一個非常好的主意,因爲一個好的關係映射器可以使實現下面的策略變得更容易。如果你使用.NET,然後NHibernate或Entity Framework是不錯的選擇。對於Java Hibernate是相當不錯的。每類層次
這裏
表您需要創建一個表爲整個類層次結構。當層次結構中的類都共享許多列時,最有意義的是 。您需要添加「鑑別器」列,以便識別每行所屬的子類。在您的例子中,你不得不
我會說這個策略讓你最感,因爲似乎沒有成爲你的子之間有許多不同的列類。每個子類
表在這個例子中,你需要創建一個表中的每個子類。當繼承層次中的類不共享許多公共列時,這是最有意義的。
所以你有這樣的表:
表
這是您的圖表中的策略。像每個子類的表一樣,當每個子類具有不同的列時,這很有用。與每個子類相比,優點是在一個大連接中查詢整個類層次結構更容易,缺點是最終會出現大量表。
在Table Inheritance上進行了閱讀。單表繼承更快更簡單,但使用空值。您的子類型主鍵也應該是外鍵。你的設計是正確的,不要聽下面的說唱歌手。 – 2013-03-09 20:11:05
@neil您可能已經注意到我建議使用記錄的屬性來區分畫廊的類型。根據Martin Fowler的說法,這是「單表繼承」:http://www.martinfowler.com/eaaCatalog/singleTableInheritance.html – 2013-03-10 00:13:47