簡體   English   中英

(T)Sql視圖包含太多業務邏輯

[英]A (T)Sql view containing too much business logic

我有一個TSQL視圖。 除了幾列之外,它是非常基礎的,因為它只執行了幾次連接,然后將所有內容粘合在一起以呈現應有的漂亮視圖。 但是,由於不是那么簡單的少數列,使得視圖代碼很難擴展,因為已經出現了新要求,使復雜列的業務邏輯無效。

無需贅述,數據庫中有一個表:

tblEmployment

這由“就業”行組成。 任何連續的列,對於給定的就業變化(假設的時間employmentTitle變化),那么當前行推入另一個表tblEmploymentHistory ,並在該行tblEmployment被改變,以便它包含最新employmentTitle

從本質上講,該視圖的作用是嘗試將tblEmployment上的tblEmploymentHistory與唯一的EmploymentIdentifier結合在一起。

視圖中更復雜的列將嘗試通過對已連接在一起的行(即tblEmployment and tblEmploymentHistory )進行各種計算來計算數字(每行的elapsedTime )。 為了獲得經過的時間,它根據指定的業務邏輯執行計算,例如,歷史記錄表中僅特定日期時間列應計入總經過時間,並且僅當該行中的其他列設置為特定值時才應這樣做。

現在已經有了新的需求,業務邏輯比以前復雜得多。 我發現很難將其包括在內,因為它變得非常凌亂,而且我認為可以在其余業務邏輯也駐留的應用程序層中以更加結構化的方式完成此工作!

刪除視圖並將其移動到應用程序的應用程序層是否“正確”? 擁有視圖的好處顯然是它很快,並且在代碼中進行大約100.000行的計算將花費一些時間。 但是,可以通過過濾掉行以使數字在10.000附近來對其進行優化。

解決這個問題的“標准”和最干凈的方法是什么?

答案取決於幾件事。 首先,確保數據庫正在執行基於集合的工作。 如果您開始進入游標(通常來說)或某種循環,最好將其放置在應用程序中。 關系數據庫不能以這種方式高效地工作。 我要考慮的另一件事是您所處環境的標准是什么? 這樣在數據庫中維護其他內容嗎? 如果是這樣,您可能希望保持一致。

最后,應該以最有效的方式返回那些結果,而又不影響其他查詢。

如所承諾的,我將為您提供一個UDF方法的示例:在我的一個項目中,我將其與40多個不同的,層次結構化的UDF一起使用,以獲取包含近1000列的結果集。

CREATE TABLE dbo.TestTable(Col1 INT,Col2 INT,Col3 INT);
INSERT INTO dbo.TestTable VALUES(1,2,3),(4,5,6),(7,8,9);
GO

CREATE FUNCTION dbo.TestFunc(@Prm1 INT,@Prm2 INT)
RETURNS TABLE
AS
RETURN
    SELECT @Prm1 AS Func_Prm1 --use names, which will be unique in any usage, this makes things much easier!
          ,@Prm2 AS Func_Prm2
          ,@Prm1 * @Prm2 AS Func_Calculated;
GO

--This would be your simple VIEW, consisting of any columns you can easily get
SELECT *
FROM dbo.TestTable
--This is how you join the "buiness logic" to your view
CROSS APPLY dbo.TestFunc(TestTable.Col1,TestTable.Col2) AS func

DROP TABLE dbo.TestTable;
GO
DROP FUNCTION dbo.TestFunc;      
GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM