#
好系统的标准
- 功能通用、完善
- 满足尽量多应用的需求
- 实现细节对应用透明
- 应用开发独立于系统实现
数据模型定义
数据的逻辑组织方式(数据的基本结构和结构的语义)
- 文档模型(Mongodb 2000s)
- 层次模型(IBM IMS 1960s)
- 网状模型(GE IDS 1960s)
- 关系模型(SQL DB 1970s~80s)
注:数据模型—决定—> 数据的访问方式 / DBMS的访问接口——> 系统的功能性、性能、易用性
数据库模式(Schema)
对数据库中数据的结构性描述
- 参照schema才能正确书写查询
一种数据库元数据(Metadata),描述数据长什么样子(相当于一个模板)
1
2
3
4
5
6Schema
{
Name:string,
Manufacturer:string
Catalog_numver:num
}
- Data Model相当于Schema的Metadata,即Meta Metadata
注:Mongodb没有一个特定的schema的过程,只是程序猿在存数据的时候脑子里有这个schema
数据模型:JSON/BSON
如何衡量数据模型的能力?
表达能力:
- 数据本身能够表达什么信息?
- 计算机能够理解的信息
- 查询能够满足哪些信息需求?
注: 表达能力越强,查询时返回的值越快越准确
表达能力的两个维度
- 范围:能够满足哪些信息需求
- 上限为Turing Completeness(程序设计语言能做到的范围)(数据库的查询做不到Turing Completeness)
- 精简程度:用户描述需求是是否方便
- Prolog比Java表达更强更精炼,因为Prolog逻辑性强
注:数据库系统将查询的语言转换成数据库查找的语言
- Prolog比Java表达更强更精炼,因为Prolog逻辑性强
数据模型的论战:
- Charles Bachman 网状模型 Navigational Database Network Model
Edgar F.Codd 关系模型 Relational Database Relation Model
- 70年代末更倾向于关系数据库
网状数据库(Navigational DB)
a. 查询通过指针访问Codd坚持的看法
- DBMS应该和应用程序尽可能保持相互独立(模块化)
- 数据的存放顺序与程序无关
- 数据的使用与程序无关
- 数据的访问方式与程序无关(网状和层次模型违背了这点)
- DBMS应该和应用程序尽可能保持相互独立(模块化)
如何避免依赖性
- 提升数据模型的表达能力
- 声明是程序设计语言(而不是过程式语言)
- Prolog 、 SQL 、 First Order Logic(一阶逻辑语言)
- 只把需求说出来,不说具体怎么做。
- 注:关系型数据库就着重声明式语言,Mongodb是声明式语言,但是拿到数据之后,还是得通过java等过程式语言进行处理
问答:
- 声明式程序一定比过程式的更好吗?
- 并不是
- 表达能力越高越好吗?
- 不是,度的把握,如单反照相机和傻瓜相机