如何用非数据库存数据:
记事本逗号分隔数据
如何查询?
for遍历行{
每一行变成字符串
逗号分隔
}
这样只能做最简单的查询,其他的操作都不支持
早期的数据库就是这样的,如果你想对其进行操作,需要对其底层高度了解,但是现在操作直接打代码就行
这就是逻辑与物理层高度耦合
codd
改变了一切,创造了relational model
关系型数据库
在简单的数据结构中,用高级的数据库语言,
不要告诉数据库具体怎么做,告诉他要做什么就好了
物理层逻辑不要让用户考虑,要开发者考虑这件事情
data model
数据模型
DBMS:
Relational
NoSQL:
Key/Value
Graph
Document
Column-family
machine learning:
Array / Matrix
bosolete/legacy/rare:
Hierarchical
Network
Multi-Value
三个东西:
structure,定义数据内容与关系的
integrity,保证数据的内容有一定的约束
manipulation,向上提供编程接口的
在关系型数据库中,表的本质就是关系relation
,
tuple
一组字段就是一行
一般数据库中的值是原子和标量的atomic&scalar
NULL
这个值可以出现在任何地方
n-ary relation
意思就是这个表有n个字段(列)
primary keys
主键
主键是可以唯一确定一条数据的
一般没有确认主键的数据库都会自创一列来作为主键
当然不同的数据库设置主键的方式是不同的,有按列名的,还有自增的
foreign keys
外键
就是一个表中的某一列(字段)是另一列(字段)的属性
这种关联属性就是外键
如果是多对多的话,如果不想让两个列直接产生关系,可以再做一个表来存关系,当然如果用中间表的话就不用外键了
DML
(data manipulation languages)数据操作语言
对数据进行修改的语言例如存取
procedural
说明了数据的来源和使用,relational algebra
Non-Procedural
不告诉你怎么搞,就像要结果,relational calculus
relational algebra
关系型代数,输入输出都是数据表
select
,选择,R是表名,predicate
是条件,谓词
projection
,投影,R是表名,a1,a2,an
是选择第一行是a1,a2,a3
的新表,其中an
可以为表达式
union
查询,将两个结果变成一张表,简单的拼接
intersection
取交集
difference
取补集
product
笛卡尔积
join
relational algebra
仍然带有数据库怎么执行的信息,就是如果想得到同样的信息,可以选择不同的执行方式执行,就是这个带有了如何执行的信息
sql
就是比这些更高级的语言,而且是一种类似标准的存在,就告诉数据库想要知道什么答案,但不告诉你怎么获得
总结
数据库无处不在
relational algebra
定义了数据如何处理数据,但是问题是定义的时候告诉了数据库具体的执行方式,但是数据库更加高级,会自动选择更好的方式执行,但是这个数据处理表达方式是存在的