2011-03-30 69 views
1

编辑以消除歧义:在MVC中查看而不是数据库视图。有没有办法根据条件选择不同的列?

你好,

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

什么我目前做的是有一个单一的存储过程返回所有列select * from X和我绑定取决于视图的列。我不相信这是正确的方法,因为我选择了不必要的列,数据库非常庞大,流量也在增加。

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

谢谢。

+0

我假设你所有在你的问题“视图”的使用涉及到视图在MVC(或MVP)的应用程序,而不是SQL视图? – 2011-03-30 06:30:45

+0

这是正确的,对于单词视图模棱两可的使用感到抱歉。 – Ali 2011-03-30 06:36:32

回答

0

你可以一个参数传递给SP,以确定列的列表来检索和动态执行语句,并返回。

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

  • 传递列的列表作为字符串存储过程。跟踪访问的内容是不安全和困难的
  • 传递一个代表要检索的列的列表。这个ID可以用来查找存储最相关列集的配置表(当然不是所有可能的子集)。它更安全,更易于管理。
+0

谢谢你的回答。查找配置表听起来很有趣。我会尝试自己探索它,但是,你之前做过类似的事吗?如果是这样,你能举个例子吗?谢谢。 – Ali 2011-03-30 06:38:21

+0

我做了,但我不知道你正在使用哪种语言和数据库,所以在这里可能没有关系:) – 2011-03-30 06:42:01

+0

请问为什么这很重要?不是这个问题(我认为这是一个问题)语言/数据库不可知论者? – Ali 2011-03-30 06:45:33

1

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

这意味着,你可以很容易地确定哪些存储过程中所使用的每个视图。这也意味着,你可以在每个应用程序适合(不同)过滤器,传递不同的参数,等等

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

0

基于参数的存储过程,你可以使用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 
+0

我不知道为什么我没有想过案件。我在想着它超越思考!我会写一个快速的原型,看看事情会如何发展。 – Ali 2011-03-30 06:52:13

+0

@Ali:考虑将其标记为可接受的解决方案,如果它解决了您的问题和/或提出了答案。 – ObiWanKenobi 2011-04-01 18:44:29

相关问题