# 数据库和数据仓库

# 数据库

数据库(Database)是"按照数据结构来组织、存储和管理数据的仓库"。它以一定方式组织存储的数据,让用户能对其中数据进行增删改查等操作。

数据库(Database)的特点是:

  • 相对复杂的表格结构,存储结构相对紧致,少冗余数据。
  • 读和写都有优化。相对简单的read/write query,单次作用于相对的少量数据。

数据库大体上分为SQL关系型数据库和NoSQL非关系型数据库。

# 关系型数据库

关系型数据库是把复杂的数据结构归结为简单的二元关系(二维表格),对数据的操作全部建立在一个或多个关系表格上。

这类数据库有MySql,Oracle,Microsoft SQL Server,PostgreSQL,SQLite。

# 非关系型数据库

NoSql(Not Only SQL)数据库在特定的场景下可发挥难以想象的高效率和性能,是对关系型数据库的一个有效补充。它的分类如下:

数据库类型 数据库描述 代表数据库
键值存储数据库(Key-Value) 它类似于传统语言中的哈希表,通过key来添加,查询或删除数据库,来获得较高的性能及扩展性。 Memcached、Redis、Ehcache
列存储数据库(Column-Oriented) 一个列族存储经常被一起查询的相关数据,比如人的姓名、年龄、薪资这三个属性中,薪资要单独存储。可根据姓名来索引人的其他信息。常用来应对分布式存储海量数据。 Cassandra、HBase
面向文档数据库(Document-Oriented) 数据存储的最小单位是文档,同一个表中存储的文档属性可以是不同的,数据可以使用XML,JSON,JSONB MongoDB、CouchDB
图形数据库(Graph-Oriented) 将数据以图的方式存储,实体会被看作顶点,实体之间关系被看作边 Neo4J、InfoGrid
时序数据库(time‑series) 时序数据库是基于时间的一系列数据,以时间为坐标将数据连成线,揭示趋势,规律,它需要支持数据快速写入。 InfluxDB、Prometheus、OpenTSDB、TimeScaleDB、kairosdb、CrateDB、Kudu
搜索引擎存储 提供全文搜索,分布式等功能 Elasticsearch、Solr
对象存储 通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据 db4o、Versant
xml数据库 高效的存储XML数据,并支持XML的内部查询语法,比如XQuery、Xpath Berkeley DB XML、BaseX

# 搜索引擎存储

搜索引擎数据库流行的有Solr和ElasticSearch,Solr是一个开源项目,基于Lucene,提供分布式索引、分片、副本集、负载均衡和自动故障转移和恢复功能。Elasticsearch也是构建在Lucene之上,在Solr推出几年后才面世,通过REST和schema-free的JSON文档提供一个分布式,多用户能力的全文搜索引擎。Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的,这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。

# 数据仓库

与数据库相近的一个概念是数据仓库(DataWarehouse),它为企业的决策制定提供数据支持,出于分析性报告和决策支持而创建,为需要业务智能的企业提供业务流程改进,监视时间,成本,质量。它的本质是整合多个数据源的历史数据进行细粒度,多维的分析。

数据仓库模型分为五个部分:

  • 系统记录域:这部分是主要的数据仓库业务数据存储区,数据模型在这里保证了数据的一致性。
  • 内部管理域:这部分主要存储数据仓库用于内部管理的元数据,数据模型在这里能够帮助进行统一的元数据的管理。
  • 汇总域:这部分数据来自于系统记录域的汇总,数据模型在这里保证了分析域的主题分析的性能,满足了部分的报表查询。
  • 分析域:这部分数据模型主要用于各个业务部分的具体的主题业务分析。这部分数据模型可以单独存储在相应的数据集市中。
  • 反馈域:可选项,这部分数据模型主要用于相应前端的反馈数据,数据仓库可以视业务的需要设置这一区域。

数据仓库分为四个层次:

  • ODS层:存放原始数据,直接加载原始日志、数据,数据保存原貌不做处理。
  • DWD层:结构与粒度原始表保持一致,对ODS层数据进行清洗。
  • DWS层:以DWD为基础,进行轻度汇总。
  • ADS层:为各种统计报表提供数据。

数据仓库(Datawarehouse)的特点是:

  • 数据仓库是面向主题的,它是集成的。它其中的数据是不可修改的。
  • 相对简单的(Denormalized)表格结构,存储结构相对松散,多冗余数据。
  • 一般只是读优化。相对复杂的read query,单次作用于相对大量的数据(历史数据)。

# 差别

可以从下面几个层面来看它们的差别:

  • 数据库 Database (Oracle, Mysql, PostgreSQL)属于操作性系统,就是联机事务处理OLTP(On-Line Transaction Processing),主要用于事务处理,数据仓库 Datawarehouse (Amazon Redshift, Hive)属于分析性系统,就是联机分析处理OLAP(On-Line Analytical Processing),主要用于数据分析。

    操作型处理 分析型处理
    细节的 综合或者提炼的
    实体-关系(E-R)模型 星型模型或雪花模型
    存储瞬间数据 存储历史数据,不包含最近的数据
    可更新的 只读、只追加
    一次操作一个单元 一次操作一个集合
    性能要求高,响应时间短 性能要求宽松
    面向事务 面向分析
    一次操作数据量小 支持决策需求
    数据量小 数据量大
    客户订单、库存水平和银行账户查询 客户收益分析、市场细分
  • 数据库是一种具体技术,数据仓库是一种结构体系。比如Mysql和Apache Hive,Hive实际上一个较大的体系结构,它能把数据存放在Mysql等数据库中。