2014-05-08 110 views
0

我有三個標準化表如下進行非標準化的數據

person_info  person_phone      phone_types 
------------  -------------------------------  -------------- 
| id | Name | | p_id | typeid | value | | id | type | 
|----|-------| |---------|-----------|--------| |----|---------| 
| 1 | Sam | | 1  |  1  | 4455544| | 1 | landline| 
| 2 | Bill | | 1  |  1  | 889898 | | 2 | mobile | 
| 3 | Ted | | 1  |  2  | 8898999| | 3 | fax  | 
------------  ------------------------------  -------------- 

每個人都可以有一個以上的手機或固定電話或傳真。在上面的例子中,「SAM」有兩個固定電話號碼和一個手機號碼。

我試圖檢索數據的SAM如下

SELECT 
    pi.id, 
    pi.name, 
    MAX(CASE WHEN pt.type = 'landline' THEN pp.value ELSE NULL END) AS landline, 
    MAX(CASE WHEN pt.type = 'mobile' THEN pp.value ELSE NULL END) AS mobile, 
    MAX(CASE WHEN pt.type = 'fax' THEN pp.value ELSE NULL END) AS fax, 
FROM 
    person_phone as pp 
    INNER JOIN phone_types AS pt on pp.type_id=pt.id 
    INNER JOIN person_info AS pi on pi.id =pp.p_id 
GROUP BY pi.id; 

這使我只是最後添加的電話號碼每次。

id  name  landline  mobile   fax 
1  Sam  889898  8898999  NULL 

,但我希望他們進入的所有聯絡號碼(可以是「N」爲每個人固定電話/手機號碼數)顯示爲landline1,landline2,landline3等。

如果我的方法錯了,請推薦一些其他正確的方法。

編輯 我將條件從'n'更改爲固定數字。任何人都不能有超過5個固定電話,5個移動電話和2個傳真號碼。所以現在每個人都有一個最大數量限制。

回答

0

想到的解決方案是使用group concat獲取所有數字,用某些內容分隔,然後讓應用程序處理演示文稿。

+0

GROUP_CONCAT的作品,但是我的數據庫結構是否正確?我可以繼續這個設計嗎? 我使用GROUP_CONCAT更改了MAX,並且能夠以逗號分隔的方式獲取數據。 同樣的方式,我會像這樣將人的興趣和其他一些表分組在一起。這會影響處理速度嗎? – harishannam

+0

我覺得很好。一旦獲得大量數據,解除歸一化可爲您節省一些時間。其他產品,如Cassandra,完全圍繞非規範化而不加入的概念構建。 –

+0

我的應用程序將有大約25000人的數據與他們的聯繫號碼。 我應該擔心遷移到Cassandra嗎? – harishannam