有了理论才能有实践,所以理论也是很重要的。
关系
其实所谓关系,在数学上的定义就是笛卡尔积的一个子集。
例如有两个集合:
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中引入的概念,只能建立在非聚集索引的基础上,通常情况下,非聚集索引的索引页是不包含真实数据的,只存储着指向数据页中数据行的指针,
而覆盖索引则是通过将数据存储在索引页上,从而在查找对应数据的时候,只要找到索引页就可以访问到数据,无需再去查询数据页,所以说这个索引是数据“覆盖”的。
参考: