2017-08-28 75 views
1

有些事情真的讓我感到困擾,我不知道什麼是「正確」的方法。 如果我選擇從我的數據庫中獲取聯繫人,那麼涉及的體積很大。MySQL 1:N數據映射

它會是這個樣子(約60-70列):

SELECT * 
FROM contacts 
LEFT JOIN company 
LEFT JOIN person 
LEFT JOIN address 
LEFT JOIN person_communication 
LEFT JOIN company_communication 
LEFT JOIN categories 
LEFT JOIN notes 

公司和個人是1:1級的基數所以其直線前進。 但「地址」,「通信」和「類別」是1:n基數。

因此,根據1:n表中的行數量,我會得到很多「雙」行(我不知道這是什麼真正的術語,行不是雙我知道地址或電話號碼等不同)。對於我自己作爲一個聯繫人,一個相當充滿的聯繫人,我得到了85排。

你們是如何工作的? 在我的PHP應用程序中,我總是寫一些「Data-Mapper」,其中數組鍵是「contact.ID aka primary」,然後檢查它是否存在,然後將附加數據推送到其中。另外PHP並不是真正的嚴格類型,它使得它變得容易。

現在我正在學習GO(golang),並且我認爲螺絲LOOOONG選擇和數據映射只是爲所有1:n寫入選擇....是的,沒有足夠的連接來加載充滿聯繫人的表格。我知道我可以增加聯繫,但錯誤似乎暗示這將是錯誤的方式。 我使用以下驅動程序:https://github.com/go-sql-driver/mysql

我也嘗試了GROUP_CONCAT,但後來我解決了麻煩的問題。

我必須再次執行我的映射方法嗎?還是有一些很好的解決方案嗎?我發現它很髒,點壽嗎?

+0

我不知道什麼是正確的或不正確的,但是您可以嘗試1-> many作爲foreach中的單獨查詢,並將結果粘貼到第一個查詢的結果中。 – aynber

+0

聯接太多。如果你的桌子變得非常大,它會變得非常緩慢。 – vladatr

+0

@vladatr是的,我知道,所以你說我應該通過「多個連接」來解決問題,也就是提高它或者建立一個隊列? – Tiega

回答

1

解決方案很簡單:您需要執行多個查詢!

所有「重複」行的原因是您正在生成一個名爲Cartesian product的結果。你試圖用1:n的關係連接到幾個表,但是每個表與另一個表沒有關係,所以沒有連接條件限制它們之間的相互關係。

因此,您將得到所有1:n關係的每個組合的結果。如果你在address有3場比賽,communication有5場比賽,categories有5場比賽,你會得到3×5×5 = 75行。

因此,您需要爲每個1:n關係運行單獨的SQL查詢。不要害怕,MySQL可以處理一些查詢。你需要他們。

+0

好吧,我明白你的觀點,並充分理解這一點。我如何爲電話號碼創建搜索查詢呢?我是否創建一個視圖來查找Primary-id,然後繼續說下去? – Tiega

+1

你可以做一個子查詢,或兩個單獨的查詢。 –