编辑以消除歧义:在MVC中查看,而不是数据库视图。
您好,
每次开发数据库驱动的应用程序时,我都面临着设计决策。假设我有一个表X,我想根据视图获取不同的列。一个视图可能需要一个列,另一个视图我需要所有列。
我目前正在做的是拥有一个返回所有列select * from X
的存储过程,并根据视图绑定列。我不相信这是正确的方法,因为我选择了不必要的列,数据库很大,流量也在增加。
采用这种设计的最佳方法是什么?我应该保持1 SP方式还是每个视图都有一个存储过程(每个SP返回不同的列)。有没有可能有用的设计模式?我考虑过为SP指定列,但由于我必须跟踪每个视图的columns参数,因此它会使维护成为一场噩梦。
谢谢。
答案 0 :(得分:1)
如果您使用存储过程进行数据访问,那么我更倾向于每个视图使用一个存储过程。您甚至可以引入一个约定,使得过程名称和视图名称具有某种形式的1-1对应关系。
这意味着您可以轻松确定每个视图使用哪个存储过程。这也意味着您可以在每个过程中应用合适的(不同的)过滤器,传递不同的参数等。
我假设您正在进行直接数据库访问,而不是使用某种形式的ORM或DAL。大多数这些系统,如果它们对存储过程有强大的支持,则建立在存储过程将始终返回具有相同“形状”(即相同列)的结果集的前提下。
答案 1 :(得分:0)
您可以将参数传递给SP,以识别要检索的列的列表,并动态执行该语句并返回。
你可以用两种不同的方式做到:
答案 2 :(得分: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