2010-03-31 59 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除外)。

相关问题