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個傳真號碼。所以現在每個人都有一個最大數量限制。
GROUP_CONCAT的作品,但是我的數據庫結構是否正確?我可以繼續這個設計嗎? 我使用GROUP_CONCAT更改了MAX,並且能夠以逗號分隔的方式獲取數據。 同樣的方式,我會像這樣將人的興趣和其他一些表分組在一起。這會影響處理速度嗎? – harishannam
我覺得很好。一旦獲得大量數據,解除歸一化可爲您節省一些時間。其他產品,如Cassandra,完全圍繞非規範化而不加入的概念構建。 –
我的應用程序將有大約25000人的數據與他們的聯繫號碼。 我應該擔心遷移到Cassandra嗎? – harishannam