【问题标题】:Is there a way to select different columns based on a condition?有没有办法根据条件选择不同的列?
【发布时间】:2011-07-25 20:33:55
【问题描述】:

编辑以消除歧义:在 MVC 中查看而不是数据库视图。

你好,

每次开发数据库驱动的应用程序时,我都会面临设计决策。假设我有一个表 X,我想根据视图获取不同的列。一个视图可能需要一列,另一个视图可能需要所有列。

我目前正在做的是拥有一个返回所有列select * from X 的存储过程,并且我根据视图绑定列。我不认为这是正确的方法,因为我选择了不必要的列并且数据库很大并且流量正在增加。

实现这种设计的最佳方式是什么?我应该保留 1 SP 方式还是为每个视图设置一个存储过程(每个 SP 返回不同的列)。有没有可能在这里有用的设计模式?我曾考虑为 SP 指定列,但它会使维护成为一场噩梦,因为我必须跟踪每个视图的列参数。

谢谢。

【问题讨论】:

  • 我假设您在问题中对“视图”的所有使用都与 MVC(或 MVP)应用程序中的视图有关,而不是与 SQL 视图有关?
  • 说得对,对view这个词的使用有歧义见谅。

标签: sql stored-procedures


【解决方案1】:

如果您愿意使用存储过程进行数据访问,那么我更愿意为每个视图使用一个存储过程。您甚至可以引入一个约定,使过程名称和视图名称具有某种形式的 1-1 对应关系。

这意味着您可以轻松确定每个视图使用哪个存储过程。这也意味着您可以在每个过程中应用合适的(不同的)过滤器,传递不同的参数等。

我假设您正在执行直接数据库访问,而不是使用某种形式的 ORM 或 DAL。这些系统中的大多数,如果它们对存储过程有很强的支持,那么它们都是围绕存储过程将始终返回具有相同“形状”(即相同列)的结果集的前提构建的。

【讨论】:

    【解决方案2】:

    基于存储过程的参数,您可以使用 CASE 语句返回不同的值(来自不同的列)。不过,实际的列名是固定的。

    伪代码:

    procedure get_stuff (@p_what varchar)
    as
    begin
    
      select case @p_what
          when 'NAME' then t.name
          when 'DESCR' then t.description
          else null
        end as the_column
      from my_table t
    
    end  
    

    【讨论】:

    • 我不知道为什么我没有考虑案例。我想多了,想多了!我会写一个快速原型,看看事情会如何发展。
    • @Ali:如果它解决了您的问题,请考虑将其标记为已接受的解决方案,和/或支持答案。
    【解决方案3】:

    您可以将参数传递给 SP 以识别要检索的列列表并动态执行语句并返回。

    你可以用两种不同的方式来做:

    • 将列列表作为字符串传递给存储过程。跟踪访问的内容是不安全且困难的
    • 传递一个表示要检索的列列表的 ID。此 id 可用于查找存储最相关列集(当然不是所有可能的子集)的配置表。它更安全、更易于管理。

    【讨论】:

    • 感谢您的回答。查找配置表听起来很有趣。我将尝试自己探索它,但是,您以前做过类似的事情吗?如果是这样,你能举个例子吗?谢谢。
    • 我做了,但我不知道您使用的是哪种语言和数据库,所以这里可能不相关:)
    • 请问这有什么关系?这个问题(我认为这是一个问题)与语言/数据库无关吗?
    • 你可以,我不熟悉所有的 DBMS,所以我不确定是否支持动态语句执行。客户端应用程序是用 .NET 编写的,列集 id 被映射为枚举。
    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2022-01-27
    • 2014-06-28
    相关资源
    最近更新 更多