关于数据库的What 和 Why
之前我们在计算程序模型中提到过,在计算机世界中需要处理的几个核心问题:
- 存储
- 计算
- 交互 具体到存储这一块,之前我们了解过
- 存储设备 – 内存和硬盘,以及对具体硬盘磁片的存储单元,块和内存的存储单元
- 文件系统 – 在操作系统层面上对存储的抽象,比如目录和文件
- 应用程序 – 针对不同的应用场景,可能数据内容的形式和模型会有不同的需求。
比如说,Web程序可能很多文本形式的数据,多媒体数据等等再一层抽象和封装
数据库则是提供针对不同类型的应用程序
(Web前端程序,Web后端程序,终端应用等等)
的通用数据存储,组织,管理和数据访问,的需求的高级抽象
本质上,我们谈存储和数据,就是在谈状态。
比如:
- 账号信息:账号,密码,登录状态
- 产品信息:库存信息,产品价格,消息信息(状态)
- 订单信息等等
对状态(数据)的维持管理 ->存储和组织(所有的应用程序都需要)
存储,不管哪个层面上,都是为了在特定的时限和资源下保存这些实体的状态
然后很重要的一类计算就是对这些实体的状态的转换和维护,以及比如:
- 更新账号密码
- 更新产品的库存
- 创建订单
对状态的访问 -> 操作(所有的应用程序都需要)
从各种各样的应用程序实例中,提炼抽象出的一些通用的数据存储需求,一起实现到一套系统中,就产生了数据库:
数据存储
所有数据都存储到单一文件里或者多个文件里?所有数据是否都存储到单一的机器里?
存储在什么样的设备:内存 硬盘 云服务
不同的存储 ->使用的方便性和和性能数据结构和组织
(面试要明白这个底层结构!)
SQL关系数据库:按表和行去组织,底层大概是一个红黑树结构(?)
Key-Value数据库:Hash表(数据库变大了会很难处理?)
图的数据库:图结构 ->很容易表达社交网络
对象模型:JSON这样的结构去存储,MongoDB和DynamoDB
硬盘没有内存快,单文件的并发性低,数据吞吐量低
冗余对数据查找的作用?
数据索引(如何找到数据)
索引的结构是什么样的?
支持什么样的索引?
顺序、哈希表、分层索引数据的更新和查询
关系数据库:SQL语言(SQL命令)数据的备份和冗余(防止丢失和保持可用)
备份的方式:全量备份和增量备份
恢复方式
不通过数据库的支持
备份时间,备份格式,备份压缩数据一致性,可用性(冗余和事务)
冗余 -> 一致性问题
CAP:一致性,可用性,分区容错性(无法同时满足)数据管理
数据分析的工具
访问的工具规模和Scalability(可扩展性)
等等
市面上各种不同的数据库,就是针对不同的场景和不同的需求,对以上的问题提出针对性的解决方案,并且有不同的侧重点
HDFS和Map
Mapreduce?
数据库类型
按照上面的逻辑,,数据库的特性是应用需求是多维度的,所以我们在考虑数据库的分类的时候,也得从不同维度来考虑
从数据结构和组织
关系数据库/SQL
MySQL,Oracle,DB2,PstegreSQL,SQLite
对象/Document/列-Base(NoSQL)
MongoDB,DynamoDB等等
图
Key-Value
leveldb(https://github.com/google/leveldb)
时间序列
比如金融量化交易系统的金融数据,时间维度是很重要的
从数据存储
终端应用数据库
在应用本地数据库的数据库,比如Web前端,Android/ios应用的本地数据库。
- SQLite
内存数据库
在后端系统中,可能需要一些访问更快但是不需要持久性的数据,就可能需要在内存中的数据库,
但是可以更快的读取和更新速度
比如:
Web程序中的用户登录状态,就可以存储在内存里,如果Web后端程序重启之后,
内存的数据库会丢失,但是只需要用户重新登录就好了,但是可以获得更快的更新和读取速度爬虫中的已经访问过的URLs
持久化数据库
MySQL,Oracle,MongoDB可能会更关注持久性存储,冗余和备份,保证数据的安全(Security和Safety)等等
分布式数据库
数据规模扩大之后,可能需要在多台机器(分布式)上存储,同时提供保证大量数据的存储能力,数据冗余,高吞吐的能力
云数据库
云上的完整解决方案,按需付费,可伸缩性,更专业稳定的运维能力
区块链
区块链本质上是一个可以完全分布到整个互联网的数据库!
关系数据库
关系型数据库是对一类数据库设计经验的总结和设计方法的抽象,以期得到一个通用的数据库的解决方法
关系数据组织数据的基本结构:
- 数据库
- 数据库表
- 数据库字段
- 数据库记录
SQL是一个对SQL数据库的查询和操作的通用语言
JDBC
Java程序连接SQL数据库,操作SQL数据库和执行SQL语句的库
- 程序接口
- 数据库驱动程序
Scalability
Reliability
Data Infrastructure
可扩展性
可靠性
数据架构
IOT挑战性
API建模 + 数据建模
面试
单元测试要怎么写?这是一个加分项,不问也要主动提出
存储数据,怎么设计本地的数据库?
怎么去组织API