2010-03-29 46 views
0

我是最近的大學畢業生,也是軟件開發的新僱員。事情最近有點慢,所以我得到了一個數據庫任務。我的db技能僅限於使用Rails和Django的寵物項目。所以,我對我最近的任務感到有點驚訝。SQL效率參數,添加一列或通過查詢解決?

我的經理已要求我爲Person創建一個'Parent'表,並在Person表中添加對其管理員的引用。當託管人(不是父母)是FormContact時,這是爲了方便從父母到母親。

這是我正在使用的sql-db的簡化模擬結構。如果我有權訪問Visio,我會繪製關係表。

我們有一張桌子'人',我們有一個'表'的表。有一個表格'FormContact',它將一個人與一個表格聯繫起來,並不是所有的人都與一個表格有關。有人際關係關係表(僱主,家長等)

我問過,「爲什麼不能通過查詢處理?」迴應,效率低下。 (真的!?!)

所以,我問,「爲什麼不引用表單?這樣會更有效率,因爲您不會使用child/custodian引用查詢FormContacts表。迴應,這基本上會使Parent成爲FormContact。 (足夠公平)

我繼續寫了一個查詢,從非FormContact Parent獲取到Form,並在生產服務器上進行了測試。響應時間是即時的。 SOME_VALUE是Parent的fk ID。

SELECT FormID 
FROM FormContact 
WHERE FormContact.ContactID 
    IN (SELECT SourceContactID 
     FROM ContactRelationship 
     WHERE (ContactRelationship.RelatedContactID = *SOME_VALUE*) 
      AND (ContactRelationship.Relationship = 'Parent')); 

如果我是正確的, 「這是一個不必要的變化。」我應該怎麼做,捍衛我的立場,還是應該向經理人提出要求?

如果我錯了。我的錯誤是什麼?有沒有比經理更好的解決方案?

+0

你到底在問什麼?您反對系統的哪一方面? – 2010-03-29 14:07:20

+0

我不明白SQL查詢如何低效​​。尤其像這樣簡單。另外,我沒有看到如何創建子類和列,這會導致另一個SQL查詢更高效。兩個查詢之間的唯一區別是一個使用子查詢,另一個使用fk ID。 – sanscore 2010-03-29 14:13:49

+0

您的查詢適用於給定的SOME_VALUE,請編寫一個查詢以處理來自FormContact的所有行,就像報表一樣。 – 2010-03-29 14:14:26

回答

2

首先,您的查詢可能會使用一些返工。而不是子查詢,請嘗試使用join

SELECT FormID 

FROM FormContact fc 

JOIN ContactRelationship cr on cr.SourceContactID = fc.ContactID 
           and cr.Relationship = 'Parent' 

WHERE cr.RelatedContactID = @parent_id 

其次,你要處理的問題是標準化與性能。從純粹的角度來看,是的,你的解決方案「更加正確」(因爲你沒有複製數據,這消除了重複數據中的差異導致衝突和異常行爲的可能性),但純正常化並不總是最明智的過程的行動。

規範化會導致性能損失,尤其是在較大的數據集中。這些懲罰必須與正常化的好處一起衡量,以查看哪一方「獲勝」。

這就是說,我不明白如何再加入PersonParentID列(我假設這是你將添加)將提供一個性能提升超過上面列出的連接,假設有問題的列正確編入索引。

如果上面的查詢適用於您,並且您進行了嚴格的性能測試以證明其有效性,請將其交給您的經理並要求他的輸入。因爲你是大學新生的新人,非常願意聽從你的經理的判斷,並且希望能夠在這一天發表意見。未來將會有更大的戰鬥。

+0

我喜歡這個答案。我可以將SQL查詢調整爲實際的數據庫,並且規範化與性能的解釋是有益的。此外,它解決了經理問題。謝謝。 – sanscore 2010-03-29 16:02:43