代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

我应该在数据库或数据访问层中生成一个复杂的对象吗?

  •  3
  • Dillie-O  · 技术社区  · 16 年前

    我正在为一个包含医疗数据的部门申请。它与我们这里的第三方系统接口。

    对象本身(声明)并不十分复杂,但由于数据的性质和数据库的组织,检索声明数据非常复杂。我不能简单地将所有表连接在一起并获取数据。我需要做一个“基础”查询来获取索赔的基础知识,然后根据各种问题拼凑出索赔的补充数据。

    在处理这些数据时是否更好:

    1. 在存储过程中生成对象,其中所有相关数据都是现成可用的,并遍历表变量(使用SQL Server 2005)以将所有补充信息组合在一起。

    2. 在数据访问层中生成对象,在那里我可以使用更强大的数据操作,并进行一系列快速简单的调用来检索查找数据。

    3. 使用OR/M工具并映射出所有复杂情况以生成对象。

    4. 别的东西。

    编辑:只是为了澄清下面列出的一些问题。复杂性实际上不是业务问题。如果索赔类型代码为“ub”,那么我必须从表x中提取一些补充数据。如果索赔类型代码为“hcfa”,那么我必须从表y中提取一些数据。这就是这些类型的东西。我希望这有帮助。

    7 回复  |  直到 16 年前
        1
  •  1
  •   SquareCog    16 年前

    在这种情况下,对存储过程再进行一次投票。

    您试图建模的是一个非常具体的业务逻辑(“什么是索赔”),它需要在处理索赔概念的任何应用程序之间保持一致。

    如果您只有一个应用程序,或者有多个应用程序使用相同的中间件,那么您可以将其放入客户机代码中;但是,实践表明,数据库往往比访问它们的软件更长寿。

    您不希望出现这样的情况:冗余实现中的细微错误和角情况会使不同的应用程序以稍微不同的方式查看数据。干的,等等。

        2
  •  1
  •   Dan Polites    16 年前

    出于安全原因,我将使用存储过程。您不必为正在使用的索赔表授予选择权限,这听起来有点重要。您只需授予用户访问该存储过程的权限。如果数据库用户已经对表具有选择权限,那么在数据访问层中生成对象也不会有任何错误。只要和你选择的任何选项保持一致。如果您在其他地方使用存储过程,请继续在此处使用它们。这同样适用于在数据访问层中生成对象。

        3
  •  1
  •   Jay    16 年前

    在应用程序的代码层次结构中,将决策/业务逻辑推到尽可能高的位置。ORM/存储过程很好,但不能像手写查询那样高效。代码越高,您就越了解数据的用途,并拥有智能获取数据的信息。

        4
  •  0
  •   chaos    16 年前

    我不喜欢将业务逻辑下推到持久层,所以我不推荐选项1。我将采用的方法包括有一个定义良好的程序对象,它对底层数据库实体进行建模,所以面向ORM,但是您的选项3听起来像是您认为这是一个繁重的映射任务,而我实际上不这么认为。我只需要有必要的逻辑来加载您在方法o中设置的与此对象相关的任何内容。n程序对象建模。

        5
  •  0
  •   Eric J.    16 年前

    作为一般规则,我使用数据访问层来检索数据(可能来自不同的源),并以有意义的方式返回数据。

    任何需要业务规则或逻辑(决策)的东西都将进入我的业务层。

    我不会轻易偏离这个选择。

    听起来,您生成的声明实际上是存储在不同位置的数据视图,没有任何决策或业务逻辑。如果是这样,我将倾向于管理对数据层中数据的访问。

    **我永远不会忘记我所使用的一个巨大的系统,它变得非常复杂,因为只有存储过程方面的专家才能处理中心部件…所以很多业务逻辑最终都是这样的。*

        6
  •  0
  •   harpo Binary Worrier    16 年前

    想想你计划使用数据的不同方式。应用层的全部目的是让您的生活更轻松。如果没有,我同意@hoffmandirt的说法,它在数据库中更安全。

        7
  •  0
  •   Michael Maddox    16 年前

    Stored procedures are bad, m'kay?

    在这种情况下,视图似乎比存储过程更好。

    如果您使用的是.NET,我强烈建议您使用ORM来获得对LINQ的支持。

    一般来说,在数据库和应用程序代码之间传播业务逻辑不是一个好主意。

    最后,任何解决方案都可能奏效。你不会面临成败型的决定。快走,别在这类问题上挂断电话。