2010-03-31 69 views
3

真正新手問題即將到來。有沒有一種標準(或好的)方法來處理不需要將數據庫表包含的所有信息加載到每個關聯對象中。我想在網頁的上下文中,你將只使用這些對象來構建一個頁面,而不是一個擁有更長時間的對象的應用程序。避免將不必要的數據從數據庫加載到對象(網頁)

例如,假設你有一個包含ID,標題,作者,日期,摘要和fullContents領域的文章表。如果您只是顯示包含帶摘要的文章列表的頁面,則不需要將fullContents加載到關聯的對象中。另一方面,如果您顯示的是特定文章,則可能需要爲該文章加載每個字段,並可能只是其他文章的標題(例如,用於顯示在最近的文章邊欄中)。

我能想到的一些技巧:

  1. 不要擔心,只需加載一切從每一次的數據庫。
  2. 爲每個表有幾個不同的可能繼承的類,併爲情況創建適當的類(例如,SummaryArticle,FullArticle)。
  3. 使用一個類,但在創建時將未使用的屬性設置爲null,如果該字段不需要並且要小心。
  4. 授予對象訪問數據庫的權限,以便它們可以根據需要加載一些字段。
  5. 還有別的嗎?

上述所有的似乎有相當大的缺點。

我是相當新的編程,很新的OOP和完全陌生的數據庫,所以我可能會在這裏完全缺少明顯的答案。 :)

回答

0

你有很多方法來解決你的問題。

  1. 在數據庫中使用存儲過程來刪除不需要的行或列。這可以很好地工作,但佔用一些空間。
  2. 使用某種ORM。對於.NET,您可以使用Entity Framework,NHibernate或Subsonic。 .NET還有很多其他的ORM工具。 Ruby有它內置的Rails。 Java使用Hibernate。
  3. 將嵌入式查詢寫入您的網站。不要忘記參數化他們,否則你會打開黑客。由於SQL和代碼的混合,此選項通常會被忽略。此外,它是最容易突破。
0

從你的列表中,選擇1,2和4可能是最常用的。那麼,除非你的應用程序負載過重或者你的表中有一些非常重的字段,否則使用這個選項並保存你自己找出更好的東西的麻煩。

2.有幾種不同的,可能是遺傳的,每個表類,並創建一個合適的情況下(如SummaryArticle,FullArticle):這樣的類常常被稱爲「視圖模型」或類似的東西,並根據在您的數據訪問策略中,您可能能夠掌握這些對象而無需實際聲明任何新類。例如,使用Linq-2-Sql,表達式data.Articles.Select(a => new { a .Title, a.Author })將爲您提供一組具有屬性TitleAuthor的匿名類型對象。生成的SQL將類似於select Title, Author from Article

4.爲對象訪問數據庫,使他們能夠按需加載某些字段:你覺得這裏會usaly被稱爲「代理對象」和/或它們的屬性下文稱作爲是「懶加載」的對象。再次,根據您的數據訪問策略,創建代理可能很難或很容易。例如。使用NHibernate,您可以通過在您的映射中引入lazy=true來獲得lazy properties,並自動創建代理。

你的問題沒有提及如何你實際上是從數據庫到對象映射數據了,但如果你不使用任何ORM框架的那一刻,就在NHibernateEntity Framework看看 - 他們都非常堅實的解決方案。

1

(1)默認情況下,加載整個對象,不幸的是ORM的作用。這就是手調SQL更好的原因。但是大多數對象不需要這種優化,並且可以在以後延遲優化。不要過早地進行優化(但是要編寫好的SQL/HQL,並使用索引進行良好的數據庫設計)。但總的來說,我所看到的ORM項目導致了很多懶惰的方法,牽扯或更新了比需要更多數據的方式。

2)不同的模型(實體),取決於操作。我更喜歡這個。可以向對象域添加更多的類,但對我而言,它是最乾淨的,並且會帶來更好的性能和安全性(特別是在您序列化爲AJAX時)。我有時使用一個模型將對象序列化到客戶端,另一個模型用於內部操作。如果你使用繼承,你可以做得很好。例如CustomerBase - > Customer。 CustomerBase可能有一個ID,名稱和地址。客戶可以擴展它來添加其他信息,甚至是密碼等。對於列表操作(列出所有客戶),可以使用自定義查詢返回CustomerBase,但對於單獨的CRUD操作(創建/檢索/更新/刪除),請使用完整的Customer對象。即使如此,要小心你的序列化。大多數框架都有屬性的白名單,他們將不會序列化。使用它們。

3)危險的特殊情況會導致系統中的錯誤。 4)性能不佳。打一次數據庫,而不是每個字段(BLOB除外)。

相關問題