2012-05-11 93 views
1

首先,英語它不是我的第一語言,隨時編輯我的問題,我很抱歉任何可能冒犯你的錯誤或不清楚暴露問題。tsql加入最佳實踐建議

我有幾個SQL查詢有很多聯接,這些聯接是基於聚集索引(不用擔心)。一些連接僅用於尊重標準化,因爲維護很直觀,但有時可能會跳過一些連接。在最佳實踐方面,我不清楚如何處理這些聯接。

編輯:

一個簡單的例子:

select * 
from things 
join things_categories on 
    things_categories.id_thing = things.id_thing 
join categories on 
    categories.id_category = things_categories.id_category 
join categories_properties on 
    categories_properties.id_category = categories.id_category 
where 
    categories_properties.bo_default = 1 

但它可能做的事:

select * 
from things 
join things_categories on 
    things_categories.id_thing = things.id_thing 
join categories_properties on 
    categories_properties.id_category = things_categories.id_category 
where 
    categories_properties.bo_default = 1 

第二加入它沒有必要(我有在數據庫級的完整性),這只是因爲使代碼更直觀並且尊重數據庫規範化。我不確定我是否應該遵循最小可能的高效路徑,或者留下不必要的連接來尊重規範化並使代碼更直觀。

任何提示?

所有最優秀的。

+0

這不是一個真正的問題恕我直言,所以我懷疑你會得到任何有用的答案。 – YvesR

+0

我不同意你的意見,不過謝謝你。 – user1330271

+0

你面臨的問題是什麼?意思是什麼,必須改變,爲什麼? – ericosg

回答

1

它已經消失,你是否已經完整。

在一方面,如果categories_properties table已在id_category column一個foreign key,那麼完整性存在,你不需要讓joincategories table

在另一方面,如果完整性可能不存在(即:有在categories_properties tableid_categories未在categories table定義),那麼你應該做的join

+0

完整性存在(數據庫級別)。但是有時候跳過這些步驟會使代碼難以閱讀,反而會導致不必要的步驟。 – user1330271

+1

然後它的性能(它不會影響那麼多)vs可讀性。 –

+0

是的,但考慮到我正在使用羣集密鑰的無意義步驟。表現糟糕嗎? – user1330271

1

的加盟:

join categories on 
    categories.id_category = things_categories.id_category 

是非常必要的,因爲categories表在未來用於連接:

join categories_properties on 
    categories_properties.id_category = categories.id_category 

所以它肯定需要的,如果它沒有定義,如SQL要求因爲你需要建立它需要的鏈接,並將它們連接到下一個鏈接。

然而,什麼是非常痛苦的是select *。 你不需要所有的信息,因爲*會帶來所有表中的所有數據。

也許你可以從每個表中指定你需要的東西,或者最壞的情況是使用東西*來指定特定表的所有列。

+0

*僅供使用,因爲它是樣本。我可以讓下一個連接跳過分類表,因爲我已經有了需要加入另一個表的id_category。 – user1330271

1

如果您不需要連接,請不要使用它。你正在採取完全不需要的表現。不要強制數據庫執行它不需要執行的工作,因爲您認爲它看起來更加合適,您應該考慮在查詢的可讀性之前的性能。畢竟,一旦你開始編寫高性能的SQl代碼,它就會變得更具可讀性。但是,通過確保查詢的兩個版本都返回相同的結果集,確保實際上不需要它。