真的会出现新手问题。是否有标准(或良好)方法来处理不需要将数据库表包含的所有信息加载到每个关联对象中。我在网页的上下文中思考,你只会使用这些对象来构建单个页面,而不是使用寿命较长的对象的应用程序。
例如,假设您有一个包含id,title,author,date,summary和fullContents字段的Article表。如果您只是显示包含带有摘要的文章列表的页面,则不需要将fullContents加载到关联对象中。另一方面,如果您正在显示特定文章,您可能希望为该文章加载每个字段,也可能只是其他文章的标题(例如,在最近的文章侧边栏中显示)。
我能想到的一些技巧:
以上所有似乎都有相当大的缺点。
我对编程很新,对OOP来说是新手,对数据库来说是全新的,所以我可能完全没有在这里找到明显的答案。 :)
答案 0 :(得分:1)
(1)默认情况下,加载整个对象是ORM所做的事情。这就是为什么手动调优的SQL表现更好。但是大多数对象不需要这种优化,并且您可以始终将优化延迟到以后。不要过早优化(但要编写好的SQL / HQL并使用带索引的良好数据库设计)。但总的来说,我看到的ORM项目产生了很多懒惰的方法,拉动或更新了比需要更多的数据。
2)不同的型号(实体),取决于操作。我更喜欢这个。可以向对象域添加更多类,但对我来说,这是最干净的并且会带来更好的性能和安全性(特别是如果您要序列化为AJAX)。我有时使用一个模型将对象序列化到客户端,另一个用于内部操作。如果使用继承,则可以很好地完成此操作。例如CustomerBase - >顾客。 CustomerBase可能具有ID,名称和地址。客户可以扩展它以添加其他信息,甚至是密码之类的东西。对于列表操作(列出所有客户),您可以使用自定义查询返回CustomerBase,但对于单个CRUD操作(创建/检索/更新/删除),请使用完整的Customer对象。即使这样,也要小心你的序列化。大多数框架都具有属性列表,它们将会并且不会序列化。使用它们。
3)危险的特殊情况会导致系统出现错误。
4)表现不佳。点击数据库一次,而不是每个字段(BLOB除外)。
答案 1 :(得分:0)
您有多种方法可以解决您的问题。
答案 2 :(得分:0)
从您的列表中,选项1,2和4可能是最常用的选项。
1。不要担心,只需每次都从数据库加载所有内容:好吧,除非你的应用程序负载很重或你的表中有一些非常重的字段,使用这个选项并节省你自己的麻烦把事情做得更好。
2。为每个表都有几个不同的,可能是继承的类,并为这种情况创建适当的类(例如SummaryArticle,FullArticle):这类通常被称为“视图模型”或类似的东西,并取决于您的数据访问策略,您可能能够在不实际声明任何新类的情况下获取此类对象。例如,使用Linq-2-Sql,表达式data.Articles.Select(a => new { a .Title, a.Author })
将为您提供具有属性Title
和Author
的匿名类型对象的集合。生成的SQL类似于select Title, Author from Article
。
4。赋予对象访问数据库的权限,以便他们可以按需加载某些字段:您在此处描述的对象通常称为“代理对象”和/或其属性被称为“延迟加载”。同样,根据您的数据访问策略,创建代理可能很难或很容易。例如。使用NHibernate,您只需在映射中输入lazy=true
即可拥有lazy properties,并自动创建代理。
您的问题没有提及您现在如何将数据从数据库映射到对象,但如果您目前没有使用任何ORM框架,请查看NHibernate和Entity Framework - 它们都是非常可靠的解决方案。