将消费者定义的聚合(例如SQL计数)与“纯”模型对象结合起来?

时间:2009-03-06 17:28:47

标签: database oop orm model

将自定义(通常是易失性)数据引入实体模型类的最佳做法是什么?这听起来似乎是一种不好的做法,但它似乎是一种非常常见的情况。在我们最近的Web应用程序中,我们开发了一个合适的模型,在大多数情况下,我们可以使用加载模型实但有些情况下我们无法负担加载整个实体层次结构;我们需要加载一些SQL COUNT的结果,或者可能在模型实体旁边(或嵌入内部)加载一些其他信息。所以基本上,要求和条件是:

  1. 这是一个Web应用程序,其中99.9999999999%的操作都是读取操作。

  2. 他们不需要处理或执行任何复杂的业务逻辑。我们只需要快速获取HTML数据。

  3. 在一些性能危急情况下,我们需要加载不适合任何模型属性的SQL聚合结果。

  4. 如果需要,我们需要一种可扩展的方式来引入任何新的自定义数据。

  5. 如果不在ORM周围做太多工作(例如来自db的原始数据),你通常如何解决这个问题?我确信已经多次讨论过这个问题,但是我无法找到一个好的Google查询来找到有用的东西。

    编辑:由于我后来意识到这个问题形成得不是很好,我决定重新制定它并开始new one

3 个答案:

答案 0 :(得分:2)

如果您只是从浏览器获取关系数据,而在两者之间几乎没有任何行为,则听起来就像您尝试用OO范例解决关系问题。

我可能倾向于完全放弃面向对象的方法。

我团队最近重写了一个应用程序,询问“什么是最简单的东西可能有用?”和“问题最接近的语言是什么?”。我们的新应用程序取代了OO,最终缩小了10倍,更快,更便宜。

我们在数据库服务器上使用SQL,存储过程,XML库,使用XSLT(获取HTML)和javascript。

答案 1 :(得分:0)

像我这样的OOP纯粹主义者会去装饰模式。 http://en.wikipedia.org/wiki/Decorator_pattern

但问题是,有些人可能不需要它提供的灵活性。另外,为每个不同的操作创建新类似乎有些过分,但它提供了良好的编译类型检查。

答案 2 :(得分:0)

我认为最佳做法是您的应用程序使用Domain Model模式消耗数据。域模型可以提供业务逻辑方法,用于执行有意义且与您的应用程序需求相关的查询类型。

这些可以获取直接映射到数据库行的“实时”结果,因此可以进行编辑和“保存”。

此外,域模型可以提供获取只读结果的方法,这些结果太复杂而无法轻松保存回数据库。这包括您的分组聚合查询结果示例,还包括连接的查询结果集,表达式作为列等

域模型模式提供了一种将应用程序的OO设计与物理数据库设计分离的方法。