什麼型號的these比較好? A還是B? 考慮到我有更常見的列(實際上是5),更多的實體(超過60)和更多的關係,而大多數表只是簡單的字典(枚舉名稱集),並沒有自己的列。繼承與普通(相同的命名和類型)列?
1
A
回答
2
我肯定會使用示例A.所有的查詢都要加入NamedEntity以進行每次查找,這會變得複雜得多(而且可能慢得多)。
即使你的ORM完全抽象了這種繼承關係,但我敢打賭,你將不得不在某個時刻編寫一個原始SQL查詢,並且必須將NamedEntity連接到每個表上將是一個巨大的痛苦。
0
我同意安迪。試圖將其抽象出來並將來自不同領域(客戶名稱,城市名稱,國家名稱)的內容混合在一列中是毫無意義的。它會使選擇數據類型,完整性約束,參照約束和查詢所有不必要的複雜和低效。
1
我會將這些共享字段放在ComplexType中,然後將該類型的屬性添加到每個實體。
(繼承使用ORM時,應遵循相同的規則,在正常OO,當你有一個「是一個」關係。)
所以封裝在一個複雜類型的repitition,避免繼承。
雖然,名稱應該不是那種複雜的類型,它似乎是實體的核心屬性。
0
有一個通用模式稱爲「泛化 - 專業化」。 OO通過繼承來處理gen-spec。這對於OO思維來說似乎簡單自然。
SQL和SQL背後的關係數據模型是構建現實的強大工具。但是OO的思維方式與它截然不同。有一種方法可以爲gen-spec模式設計表格,而且它非常實用且功能強大。它不像繼承一樣簡單,並且它在介紹性的數據庫設計教程中經常被掩蓋。
如果您要在網上搜索「生成專業化關係建模」,您會發現至少有十幾篇優秀的文章和一些不太好的文章,用於設計表格以模擬gen-spec模式。
相關問題
- 1. 類繼承命名
- 2. PHP繼承:子類與父類具有相同的類名
- 3. IL Emit基類名稱與繼承類相同; protobuffer不接受環狀繼承
- 4. 相同類型的繼承類向量相同
- 5. 命名衝突:繼承類和接口中的方法名稱相同
- 6. 基本類型和繼承類型的工作通用列表
- 7. Mongoid命名空間模型和繼承
- 8. 如何命名繼承類?
- 9. 類型繼承與表繼承
- 10. 與泛型類型和繼承
- 11. 繼承類和命名空間
- 12. 單表繼承和命名空間類
- 13. 命名查詢和繼承
- 14. 多個超類的多繼承,C++和相同方法簽名
- 15. 泛型類型和繼承
- 16. 繼承和泛型類型
- 17. WCF - probem與序列化繼承類型
- 18. C#通用類型繼承
- 19. 通用子類型繼承
- 20. JAVA:泛型類繼承和泛型類型繼承
- 21. 繼承與C#泛型,而類繼承類型
- 22. 類與繼承類類型的泛型列表 - multiinheritence
- 23. C++從具有相同名稱的成員的基類繼承多重繼承
- 24. C++繼承 - 用不同的參數類型相同的方法名
- 25. xml序列化和繼承類型
- 26. 多重繼承:相同的變量名
- 27. 繼承不同類型的向量類
- 28. 繼承到的基類命名空間
- 29. 命名伊娃與類名相同
- 30. C++泛型類和繼承
但我有超過60個實體共有5個字段(不提Id)。而且「不要重複自己」的原則讓我感到緊張,我把這五個領域的每一個都複製粘貼60次。 – Ivan 2010-05-08 22:54:14
我不確定你的公共列是什麼,但是至於Id和其他「常見」列,如CreateDate,LastModifiedDate,我肯定會把它們放在每張表上。你是對的,那裏有重複,但相信我,不要太喜歡數據繼承關係。如果您有超過60個實體共享相同的域相關列(即非審計列),則可能值得在數據庫中考慮不同的繼承模型,如「每個層次的表」。 – 2010-05-08 23:02:47