zoukankan      html  css  js  c++  java
  • DDIA

    这次读的书是DDIA, Designing Data-Intensive Application, 中文<设计数据密集型应用>, 我看的是翻译https://github.com/Vonng/ddia.

    读书计划如下:

    第一部分:数据系统基础
    第1章 可靠、可扩展与可维护的应用系统 18 第1周 10.12 ~10.18
    第2章 数据模型与查询语言 33
    第3章 数据存储与检索 64 第2周 10.19~10.25
    第4章 数据编码和演化 26 第3周 10.26~11.1
    第二部分:分布式数据系统
    第5章 数据复制 37 第4周 11.2 ~ 11.8
    第6章 数据分区 16 第5周 11.9 ~11.15
    第7章 事务 40 第6周 11.16~11.22
    第8章 分布式系统的挑战 34 第7周 11.23 ~ 11.29
    第9章 一致性与共识 47 第8周 11.30 ~ 12.6
    第三部分 派生数据 我个人觉得后面这几章读起来很晦涩,不知道是不是翻译的原因,到时候我们讨论下,看看要不要继续这三章
    第10章 批处理系统 . 37 第9周 12.7~12.13
    第11章 流处理系统 37 第10周 12.14 ~ 12.20
    第12章 数据系统的未来 49 第11周 12.21 ~12.27

    第一章 可靠性, 可扩展性, 可维护性

    可靠性
    一般说到应用做到4个9, 就是指应用的可靠性达到99.99%可用, 即一年的时间中有99.99%是可用的, 不可用时间为$ 365 * 24 * (1 - 0.9999) = 0.876 $小时, 折合52.6分钟.
    系统宕机的原因一般分以下3种, 硬件错误, 软件错误, 人为错误.

    可扩展性
    指的是负载增加时, 可以应对. 一般来说就是业务增长的时候, 系统仍能支持.
    一般来说扩展分为纵向扩展(提高单机性能)和横向扩展(增加服务器).

    可维护性
    指的是软件开发完之后的后续运维, 修复漏洞, 添加新功能等.

    • 可操作性. 便于运维团队保持系统平稳运行.
    • 简单性. 从系统中消除尽可能多的复杂度, 使新工程师也能轻松理解系统.
    • 可演化性. 使工程师在未来能轻松对系统进行更改.

    第二章 数据系统的各种类型

    关系数据库与文档数据库

    日常用的最多的数据库就是关系数据库, 如MySql, SqlServer, Oracle等. 后来由于关系数据库的性能问题, 出了NoSQL数据库, 原本是想取代关系数据库, 结果发现取代不了, 就把NoSQL解释为Not Only SQL, 意为SQL的扩展. NoSQL的代表有MongoDB, RethinkDB, CouchDB, Espresso等.

    为了表示一个多层次的关系, 关系数据库会把各层对象分别建一个表, 再用表的连接来表示对象的关系, 优点是关联查询比较灵活, 缺点是慢和复杂. NoSQL数据库会把关系以一个灵活的结构直接保存起来, 如一个JSON字符串, 优点是一次查询可拿到所有层次的数据, 缺点是关联查询麻烦, 适合不需要关联查询的数据.

    现代的数据库倾向将两种特性结合起来, 关系数据库可以支持JSON和XML, 如SqlServer和MySql的新版都支持JSON的构建和查询; NoSql数据库可以支持类似关系的连接, 如RethinkDB在其查询语言中支持类似关系的连接,一些MongoDB驱动程序可以自动解析数据库引用(有效地执行客户端连接,尽管这可能比在数据库中执行的连接慢,需要额外的网络往返,并且优化更少).

    声明式查询与命令式查询

    声明式查询指明了返回的条件, 典型代表是SQL, 如

    SELECT * from animals WHERE family='Sharks';
    

    命令式查询指明了达到条件的每一个确定的步骤. 以C#代码举例, 一般来说for和foreach就是这样的.

    result;
    foreach(var animal in animals)
    {
          if(animal.family == "Sharks")
          {
                result.Add(animal);
          }
    }
    

    声明式的优点是, 只提供需求, 具体实现由他人实现, 优化起来无感知. 如我们提供sql语句, 由数据库引擎提供具体的实现, 如何操作磁盘访问数据等. 我们可以在不修改sql的前提下, 享受数据库引擎升级带来的优化. 缺点是性能上相对不可控, 还是要去了解数据库引擎的具体实现, 才能做到高性能的sql语句.

    命令式相对可控一些, 可以自己去优化具体操作的步骤, 达到高性能. 缺点是不同平台的兼容性会比较差, 且代码量显得较多.

  • 相关阅读:
    给View设置多个Tag
    Android studio 编译报错 Error:Error converting bytecode to dex:
    ViewPager设置自适应
    华为手机播放视频时seekBar拖不动
    Android studio 导入Eclipse项目 Vitamio播放器报错
    多线程Bug
    时间选择器,不同系统版本差异的解决办法
    Django测试pytest
    Nginx
    docker
  • 原文地址:https://www.cnblogs.com/winwink/p/DDIA1-DataModelsandQueryLanguages.html
Copyright © 2011-2022 走看看