2012-08-19 61 views
0

我有以下表SQL Server 2008 - 基於子值,切換表中的值。觸發器或計算列與子查詢?

父表

ds_id(pk) /state 
------------------------- 
     1.  / valid 
     2.  / invalid 

子表

d_id(pk)/ ds_id(fk)/approve 
----------------------------------------- 
    1. /  1.  /  false 
    2. /  1.  /  true 
    3. /  2.  /  false 
    4. /  2.  /  false 

父表的state欄會變爲有效,如果其子之一子表的批准列設置爲true

我想找到最簡單最有效的方法來計算和設置基於其子級的狀態列。

我正在使用SQL Server 2008.

狀態的變化需要是即時的。

預計系統將有幾千父母,每個父母約有5個孩子。

它更可能是您沒有提供足夠的信息來決定的「最佳」的方法是什麼,孩子就被更新

+0

基本上你想要parentTable.IsValid = Max(childTable.approve)(如果任何一個孩子的屬性爲true,則返回true)。將有效標誌存儲在父表中並維護該關係的價值是什麼?從應用程序的代碼中計算父表的狀態還是通過存儲過程返回它會更好? – 2012-08-19 19:56:28

+0

我從來沒有考慮過不存儲的價值,感謝指出的可能性。但是這需要我每次想要使用它時計算狀態。例如基於狀態隱藏一個按鈕。 – 2012-08-19 20:05:01

+0

@MitchellLee:有效,但取決於邏輯以及如何實現。這就是我首先對事物進行建模的方式,但是對於存儲值進行建模 - 測試並比較性能來決定。當存在實際的客戶數據時重新審視該問題......有時存儲該值的效果會更好。 – 2012-08-19 20:08:54

回答

1

。這兩個基本思想是在子查詢時孩子值發生變化或總結時,更新父代中的數據。

這裏有一些問題,這些方法之間做出選擇:

什麼比在父級別到子級別更改讀?如果父值會每次讀取一次兒童值發生更改,那麼動態執行動作(在查詢時)效率可能更高。如果每次子值發生變化時父值被讀取一千次,那麼靜態執行它(使用更新)效率可能更高。

更改孩子和閱讀父母的預期響應時間是什麼?

我們在談論多少數據?如果兒童數據的測量數百行,則可能不值得努力使查詢更有效。

而且,所提出的數據對於自動更新有點尷​​尬。如果孩子從批准=真變爲假,那麼會發生什麼?您必須閱讀所有其他孩子才能在父級中設置值。另一種方法是保留已批准孩子的數量,然後對該數值進行邏輯處理。要做到這一點是與父表中的計算列的一種方式:

create table . . . 
    stats as (case when ApprovedCount > 0 then valid else invalid end) 

至於自動更新一般的觀察,我認爲觸發器是相對難以維持。使用觸發器似乎不「簡單」。相反,我會有一個存儲過程來更新子表並使用存儲過程進行更新和任何其他邏輯。

[迴應意見] 建議的數據非常少。孩子和家長很可能都會放在一個數據頁上。除非你要進行事務處理基準測試中,您可以在查詢父母做對飛的計算:

select p.id, (case when count(*) > 0 then valid else invalid end) as validness 
from parent p left outer join 
    child c 
    on c.parentid = p.parentid and c.accepted = true 
group by p.id 

這會非常快。而且,如果您一次只查找一位家長,這將非常快速。當然,如果您預先計算了這個值,那麼速度會更快。然而,相對於保持價值的複雜性,速度的提高極不可能是重要的。

+0

在這種情況下,響應時間需要是即時的。還有人認爲每個家長平均有大約5個孩子,孩子更有可能更新 – 2012-08-19 20:38:07

+0

有多少父母? – 2012-08-19 20:41:24

+0

在幾百個範圍內,每個孩子只有一個家長 – 2012-08-19 20:45:42

相關問題