代码改变世界

关系型数据库

2018-05-28 22:36  taozsay  阅读(247)  评论(0编辑  收藏  举报

有了理论才能有实践,所以理论也是很重要的。

关系

其实所谓关系,在数学上的定义就是笛卡尔积的一个子集。

例如有两个集合:

s1 ={a,b}

s2 = {1,2}

那s1和s2的笛卡尔积就是 :

s1 × s2 = {(a,1),(a,2),(b,1),(b,2)}

那么S 的任意一个子集都是关系:

{(a,1),(a,2)} 是一个“关系”

{(a,2), (b,1),(b,2)} 是另外一个“关系”

{(b,2)} 也是关系

......

如果你把s1和s2竖起来看,把s1看做列x能取值的集合, s2看做列y 能取值的集合, 那(x, y)它不就是一张表吗?

事务ACID

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

数据库范式

第一范式是基本要求,即每个列都是不分割的数据项, 如果连这个都满足不了,还是洗洗睡吧。

第二范式要求实体属性要完全依赖主键,不能依赖部分主键。

第三范式就是一个表中不能包含其它表中已包含的非主关键字信息。不严谨地说就是这个表只包含其他表的ID。

一般来说,你们都会遵循第一和第二范式, 但是为了性能,为了避免过多的join, 有时候会违反第三范式,冗余一些字段的信息, 这我都可以理解。

索引

  经常会问到主键和索引有什么区别?主键就是用于强制表的实体完整性,对应上面的第二范式,所以不能为空。而索引是对数据行的排序,方便查询用。在SQLServer中,主键的创建必须依赖于索引,默认创建的是聚集索引(也可以是非聚集索引)。如果对索引执行强制删除,主键也会被跟着一起删除,所以主键必须依赖于索引的观点暂时是正确的。

  聚集索引(Clustered Index)

    每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。
  如果表具有聚集索引,则该表称为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。

  非聚集索引(NonClustered Index)

  覆盖索引

    覆盖索引是在SQLServer2005中引入的概念,只能建立在非聚集索引的基础上,通常情况下,非聚集索引的索引页是不包含真实数据的,只存储着指向数据页中数据行的指针,

  而覆盖索引则是通过将数据存储在索引页上,从而在查找对应数据的时候,只要找到索引页就可以访问到数据,无需再去查询数据页,所以说这个索引是数据“覆盖”的。

 

参考: