标签:
关系型数据库,简单理解就是“行列-表-库”形式的二维数据库,采用关系模型来组织数据,简而言之就是二维表之间的字段可能通过某种关系而组合起来,形成规模较大的数据网络;当然,单独的关系表也可以作为一个简单库。
关系型数据库相较于其他类型数据库的最大优势是可以保持数据的一致性(事务处理),其他还有诸如以标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处)、 可以进行Join等复杂查询等。
关系型数据库也有相应的弊端,比如海量的读写都集中在一个数据库上的话,将会严重影响数据库的工作效率,所以大部分关系型数据库的用户都采用了主从数据库的形式来缓解负荷问题,主库负责写入,从库负责读出。但是这又可能造成主从数据更新不一致或冲突等问题。为了避免这样的问题,需要把对每个表的请求分别分配给合适的主数据库来处理。若将大数据库进行分割,实现并行操作的话,又无法进行join处理。为了加快查询的效率,一般会为关系型数据库添加索引,当表中需要添加一些必要字段时,表的结构将发生变化。此时,需要对表进行共享锁定,这期间数据的增删改查将停滞。如果需要进行一些耗时操作,例如为数据量比较大的表创建索引或是变更其表结构,就需要特别注意,长时间内数据可能无法进行更新。另外,当表结构不固定时,即采用了相对变化较多的字段时,关系型数据库也是比较难于处理的,频繁的更新表结构会使工作量大大增加。而如果查询条件相对简单时,也没有必要使用关系型数据库。
关系型数据库的三范式:
此处的不可分割,是指在可分割的情况下必须分割,这是在应用环境中来判断的,当属性是文档时,虽然文档有段落标记,但还是不应该分割。
举例:
--数据库表中的任何字段都是单一属性的,不可再分 create table aa(id int,NameAge varchar(100)) insert aa values(1,‘‘25-女‘‘) --没有达到第一范式 create table aa(id int,name varcahr(10),age char(2)) insert aa values(1,‘‘25‘‘,‘‘女‘‘) --达到第一范式
关键词是“完全依赖”,与“部分依赖”或“局部依赖”相对,如果候选键或主键由两个属性组成,非主属性不能只依赖与其中一个或部分属性。
举例:
create table sci( sno int(32),cno int(32),grade int(32),credit int(32), primary key sno,cno) 课程(cno)1---1学分(credit) 学生(sno)n---n课程(cno) 学生+课程--->分数(grade) sci sno cno grade credit 1 1 60 80 2 1 90 80 3 1 70 80 . . . . . . . . . . . . /* 如此以来,学分被大量重复存储,数据冗余 如要某课程学分,则要大量重复操作 如要加新课程,由于sno和cno共同做为主键,则在加入新课程时,必须有人选该课 如某学生某课程结业,则该学生其它课程信息也同时被删除了 总之 这种设计不太好吧,非关键字属性credit仅函数依赖于cno,也就是credit部分依赖组合关键字(sno,cno)而不是完全依赖 解决 分成两个关系模式 sc1(sno,cno,grade),c2(cno,credit)。新关系包括两个关系模式,它们之间通过sc1中的外关键字cno相联系,需要时再进行自然联接,恢复了原来的关系 */
--例 S1(SNO,SNAME,DNO, DNAME, LOCATION) 学号 姓名 所在系 系名称 系地址 /* 关键字SNO决定各个属性。由于是单个关键字,没有部分依赖的问题,肯定是2NF。但这关系肯定有大量的冗余,有关学生所在的几个属性DNO,DNAME,LOCATION将重复存储,插入,删除和修改时也将产生类似以上例的情况。 */ /* 原因:关系中存在传递依赖造成的。 即SNO 1->1 DNO。 而DNO 1->n SNO却不存在,而DNO -> LOCATION存在, 因此关键字 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说,SNO不直接决定非主属性LOCATION。 */ /* 解决目地:每个关系模式中不能留有传递依赖。 解决方法:分为两个关系 S(SNO,SNAME,DNO),D(DNO,DNAME,LOCATION) 注意:关系S中不能没有外关键字DNO。否则两个关系之间失去联系 */
标签:
原文地址:http://www.cnblogs.com/Oh-Bug/p/4723867.html