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