• 老毕 置顶
    2019-07-31
    一言以蔽之:反范式无处不在。😃

    最近正在基于Hadoop建设某国企的数据集市项目(地域性非全网),恰如老师所言,我们就是在遵循反范式的设计。

    简要来说,我们把数据加工链路分为四层,从下到上依次为:ODS贴源层、DWD明细层、DWS汇总层和ADS应用层。

    多源异构的业务数据被源源不断ETL到ODS贴源层之后,经过清洗、规范、转换、拼接等,生成各类宽表存储在DWD明细层;再根据业务模型设计,以这些宽表为基础,生成各类标准的指标数据存储在DWS汇总层;ADS层则基于DWS层的汇总指标再度组合,计算得出应用层数据,直接面向业务需求。

    在这样的系统设计中,反范式不仅体现在“宽表”的设计中,更体现在数据加工链路的完整生命周期中——上层都是对下层的冗余。
    展开

    作者回复: 总结的不错

     4
     23
  • leslie
    2019-07-31
    个人对于反范式的理解是:它会造成数据的冗余甚至是表与表之间的冗余;不过它最大的好处是减少了许多跨表查询从而大幅减少了查询时间。早期的设计其实一直强调范式化设计,可是当memcache出现后-其实就反向在揭示范式的不足。
           互联网行业和传统行业最大的区别是要求相应时间的短暂:这就造成了效率优先,这其实也是为何互联网行业的技术更新和使用走在最前面。曾经经历过设计表的过程中尽力追求范式,可是最终发现带来的问题就是性能的不足;范式其实就是规范,可是完完全全的规范-碰到特殊场景就不能那样使用。10年前接触到非关系型数据库时就引发了这种思考,sql server和mysql的机制和查询特长的不同更加引发了自己对于范式的反思。
          其实不同数据库对于范式的操作应当是不同的不同行业对于效率的要求是不同的:我觉得范式与反范式的关系可能有点像现在关系型数据库和非关系型数据库的使用一样,已经不再是单一化,如何让二者合理结合最大发挥数据库的查询效率才是关键-只有最合适的没有最好的;当我们过度的追求标准化时反而会忽视了产品真实的功能者作用,如何充分合理发挥产品性能其实才是我们所追求的。
             老师觉得呢:没有最标准的,任何方式都有缺陷,没有最好的只有最合适的;就像Google 的SRE中有句经典的话“没有问题的程序是程序的特殊状态”。
    展开

    作者回复: 总结和阐述的很好,大家都可以看下
    “没有问题的程序是程序的特殊状态” 这个赞一下

    
     23
  • Yuhui
    2019-09-19
    这个数据集都是百万条记录的,如果直接导入MySQL比较慢。如果先做以下设置会大大提高导入的速度:
    SET GLOBAL unique_checks=0;
    SET GLOBAL innodb_flush_log_at_trx_commit=0;
    SET GLOBAL sync_binlog=0;

    当然这不是SQL的问题,是数据库工作方式的问题,不在本课讨论范围内,只是提供大家参考,节省准备的时间。

    导入完成以后记得把所有设置都改回1。
    展开
    
     3
  • 丁丁历险记
    2019-12-28
    反范式注意好同步。

    作者回复: 同意

    
     1
  • 梁
    2019-11-18
    olap可以用反范式,但oltp就不适合了,实时的交易和数据变化,反范式的空间换时间不适合

    作者回复: 反范式在OLAP场景比较常见

    
     1
  • 习惯沉淀
    2019-08-06
    MySQL8.0执行存储过程语句报错?[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

    作者回复: 看下delimiter 是否定义了,如果是用的Navicat 可以不用定义

     1
     1
  • 川杰
    2019-08-01
    老师您好,想问个问题;假设我在存储过程中,用到了一个临时表(作用就是保存中间数据以便后续做其他操作),先对临时表进行数据删除操作,然后对临时表进行插入操作。假设现在有两个人A,B同时调用该存储过程,是否存在如下风险,即:A执行存储过程时,正在删除数据,同一时刻,B执行存储过程时,新增数据?
     2
     1
  • 咕咕咕
    2020-01-02
    老师,请教个问题:淘宝不让修改会员名称是不是有可能更新特别麻烦?比如采用反范式设计?瞎猜的哈哈。
    
    
  • Geek_98a68c
    2019-11-12
    请问老师,冗余字段的更新有哪些方式啊?文中只是提到存储过程更新冗余字段
    
    
  • grey927
    2019-11-08
    比如用户每次更改昵称的时候,都需要执行存储过程来更新,如果昵称更改频繁,会非常消耗系统资源。
    > 其实不是不是不去同步更新昵称会比较好,就像微博的设计 ,当初我被人@的是A这个昵称,后续我改了昵称,变成了C,之前@A的这个链接就找不到我的信息了,这样是不是会好一点。
    
    
  • 峻铭
    2019-09-09
    反范式优化之前 实验结果是0.038秒,使用反范式添加user_name之后实验结果为0.002秒。怎么和老师的结果差别这么大呢

    作者回复: 不同的设备和运行环境 处理的时间不同,只要能证明这种情况下 反范式优化效率更高即可。

    
    
  • Back to the origi...
    2019-09-02
    选键是(管理员,物品名)和(仓库名,物品名)
    老师,你这里的意思是:管理员+物品名 组成一个候选键,然后仓库名+物品名 组成一个候选键的意思嘛?
    
    
  • 吃饭饭
    2019-08-02
    问个问题:【我们就可以找到数据表的候选键是(管理员,物品名)和(仓库名,物品名)】这里不太明白,如果我选择【候选键是(仓库名,物品名)和(管理员,物品名)】可不可以?
     2
    
  • ABC
    2019-08-01
    有一个问题,请问老师,如果一个字段内容存的是:

    会员ID@会员名称

    这样是不是算违反第一范式?在工作中遇到过类似方式存储的数据,但由于历史数据和牵涉过多的原因,已经无法修改。。

    在每次做统计类需求的时候,就会用反范式设计,方便查询,而且速度会很快。


    展开
     2
    
  • 床头猫🐱
    2019-07-31
    老师你好,有个问题,就是我这里有四张表都是1对1关联的,数据量大概四千多万,用left join和分四条sql查,哪个更好一点,oracle数据库,两种方式都会命中索引
    
    
  • 夜路破晓
    2019-07-31
    范式与反范式,正如传统与解构,规则与务实,稳定与突破,守成与创新,是阴阳动静的矛盾关系,两者一而二,二而一,即和而不同、求同存异,落脚点是务实,也就是应用场景和业务需求。
    所以说,这已经不单是数据库设计的问题,而中国哲学体系在互联网商业中实践指导。
    数据库设计提出范式的同时存在反范式的要求,符合否定之否定的螺旋上升轨迹,是数据库也是SQL语言保持强壮生命力而经久不衰的重要原因,是现实生存逻辑的映射。

    作者回复: 是的,很多设计思维都是相通的。不仅是正反两方面,有时候我们还会遇到 Exploit & Explore的问题,这个在探索未知世界,比如深度学习的收敛算法中会应用。

    
    
  • 全有
    2019-07-31
    老师你好,抛开本次课程,问一个现象:
    慢查询日志如下:
    # Query_time: 10.612971 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0
    SET timestamp=1564551836;
    commit;

    两个问题:
    1:Commit 是如何发生的,做啦什么事?
    2: 所耗时长为什么会那么久?
    展开
    
    
  • 许童童
    2019-07-31
    老师你好,问个问题。如果用记表国用户名称字段修改了,那评论表中用户名称是否要跟着改呢。这个怎么处理?
    
    
我们在线,来聊聊吧