在亚信面试数据仓库工程师,碰见一位高人,给我出了道sql的考题,拿出来和大家分享一下,表如下:
年龄维:
id subl_id age_min age_max age_desc sub_desc
1 1 1 15 1-15 1-10
1 2 1 15 1-15 11-15
2 3 16 30 16-30 16-25
2 4 16 30 16-30 26-30
3 5 30 45 30-45 30-45
......
事实表:
cust_id sex age deposit
1 1 7 300
2 2 20 30
3 1 16 300
4 1 39 20
.....
要求写出,性别为1,年龄小于50,按照age_desc分组计算的客户数,sum(deposit)和average(deposit),我看了后觉得表设计不合理,sql很难写。该大侠竟然拿我当小孩一般训斥了一番,眉宇间一副你这种水平也敢来亚信的样子。call,我这里给大家写出我的设计,请各位看看究竟是谁的合理些。
日期维:
range_id year_id year_range year
1 1 1900-1959 1900
....
1 60 1900-1959 1959
2 61 1960-1969 1960
..
2 70 1960-1969 1969
3 71 1970-1979 1970
....
3 80 1970-1979 1979
4 81 1980-1989 1980
....
4 90 1980-1989 1989
5 91 1990-1999 1990
....
5 100 1990-1999 1999
....
事实表:
cust_id sex year_id deposit
1 1 66 300
2 2 81 30
3 1 73 300
4 1 54 20
以上用日期维替换了年龄维,事实表中用year_id替换了age,当然这个日期维比较简单,而且我也没有完全照他的年龄范围来划分,但是思路就是这样。如果把year字段改成yyyymmdd,则该维还可以扩展到,周,旬,季度,年度等等。
其实我的思路很简单,就是年龄不应当作为字段存在,因为他是变动的,而且是可计算的。该大侠的解释是他们会定时更新事实表的年龄字段,更新数据仓库?我晕倒!!!
其实好的数据库设计可以让sql编写变得很简单,而且性能也会好,差的数据库设计不仅让sql编写异常困难,而且导致其效率低下。可叹的是某些人还偏要拿他们那蹩脚的sql自得,而不去考虑一下设计上的缺陷!!!!!!