Architecture 三层模式和大量数据

Architecture 三层模式和大量数据,architecture,n-tier-architecture,3-tier,Architecture,N Tier Architecture,3 Tier,以下是我的情况:我正在努力遵循三层模式(即表示层、业务层和数据层)。当我需要数据库中的数据时,业务层调用返回信息的数据层。数据层从不返回SqlDataReader或DataTable对象,但通常返回数据访问层已知的自定义对象的枚举。当数据层必须返回包含少量对象的列表时,它工作得非常好 我现在面临这个问题,我的应用程序(业务层)必须处理500000条记录。我可以简单地向数据层添加另一个方法并返回IEnumerable,但这听起来很糟糕。我不想在内存中加载50万条记录 我的问题是,考虑到三层模型,我

以下是我的情况:我正在努力遵循三层模式(即表示层、业务层和数据层)。当我需要数据库中的数据时,业务层调用返回信息的数据层。数据层从不返回SqlDataReader或DataTable对象,但通常返回数据访问层已知的自定义对象的枚举。当数据层必须返回包含少量对象的列表时,它工作得非常好

我现在面临这个问题,我的应用程序(业务层)必须处理500000条记录。我可以简单地向数据层添加另一个方法并返回IEnumerable,但这听起来很糟糕。我不想在内存中加载50万条记录

我的问题是,考虑到三层模型,我应该如何处理这个案例?如果我没有3层模式,我只会在我的业务类中使用SqlDataReader。有什么建议吗

更新:数据不会显示,因此这不是分页问题(这里根本不涉及表示层)。我只需要分析每一条记录,然后保存其中的一些


谢谢

我想你不会一次在前端显示500000条记录吧?你可能在做分页,对吧?因此,一次只能从数据库返回一页数据。

是的,你的直觉是正确的

我打赌你的用户界面客户端不想一次查看50万条记录。谷歌并不是在一个页面上回复每一次点击;你也不会

您可以选择应用程序在何时何地处理这50万条记录。你可以把它们分成更小的工作单元;您可以异步处理它们;您可以编写存储过程并在数据库中处理它们,而无需将它们全部转移到中间层


MVC模式很棒,但它不是神圣的。选择适合您的应用程序的选项。

这是一个常见的问题,在您需要整合大量数据并向用户呈现摘要的情况下会频繁出现(报告就是一个典型的例子)。在设计解决方案时,应考虑这些因素。当对某些特定体系结构模型的严格一致性使应用程序效率低下时,忽略sql阅读器(或类似工具)提供的效率是没有意义的。通过使体系结构模型适应您的需要,通常可以克服其中一些问题。通用体系结构模型很少适用于开箱即用。它们是应该应用于你的特殊需要的指导方针。

一张纸永远无法战胜现实。如果您的具体问题要求打破三层模式,那么就这样做。

在数据库级别进行您需要的任何分析都是无耻的。如果您可以对存储过程进行切片和切分,或者与存储过程进行必要的关联,并将应用程序用于更复杂的操作,那么您就可以了


问题是,用户是否希望按下按钮处理所有500K记录并看到结果?如果是这样,他们是否愿意坐下来观看旋转的gif,或者在流程完成后收到某种类型的通知是否令人满意?如果处理500K非常重要,您的数据模型是否需要更改以支持此过程?有一些处理方法,例如和,适合于如此高的容量,但是您需要达到这个程度吗?在对性能发火之前,您可以设定用户的期望值。

在某些情况下,您必须打破三层界限。但在你这么做之前,你可以问问自己:

  • 当您“分析每个记录,然后保留其中的一些记录”时,这真的是业务逻辑的一部分吗?还是一种数据访问功能?这种情况可能属于数据访问层

  • 如果这是业务逻辑的一部分,您是否需要所有500000条记录才能决定是否“保留”任何单个记录?可能是业务层应该一次处理一条记录。连续进行500000次数据库调用并不漂亮,但如果从概念角度来看应用程序应该这样做,那么有一些方法可以缓解这种情况

  • 我不建议仅仅为了保持3层的独立而做任何愚蠢的事情。但有时,当你认为你必须跨越界限时,那是因为设计中有些东西需要重新审视

    --

    bmb

    您可以在SqlReader类之上构建一个抽象。这样,您不必直接传递SqlReader,但仍然可以一次处理一个对象


    想想迭代器。

    如果我理解正确,你想“分析”这些记录,然后保留其中的一些记录,去掉其余的记录。在这种情况下,我认为最好在数据库本身(PL/SQL或T/SQL)中处理这个问题。像这样的需求应该是最高优先级,而不是体系结构。由于您不只是显示分析,因此最好在过程本身中执行。

    在数据库中执行筛选。不管怎样,你都不需要带超过500000条记录去过滤掉。为什么要把它们都带到中间层,只是为了移除它们。在后端(存储过程)中使用SQL引擎尽早处理操作(数据)。最有效,类似于在发送到IIS之前在表示层上检查基本输入检查