2011-03-30 84 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

相關問題