数据库系统概论(二)数据库设计--视图、模式
数据库设计的六个阶段
1.需求分析:分析用户需求,包括数据、功能和性能要求----建立数据字典
2.概念结构设计:主要采用E-R图进行设计,包括画E-R图-----产生概念模式(概念模式在很多说法中也就是逻辑模式)
1、2是与DBMS独立的设计阶段
3.逻辑结构设计:将E-R图转化为表,实现E-R概念模型到关系(数据)模型的转变-----产生逻辑模式/模式,并且在基本表的基础上建立视图(view),形成数据的外模式
4.物理结构设计:选择合适的存储结构和存取路径(建立索引)----形成数据库内模式
3、4与选用哪种DBMS密切相关
5.数据库实施:编程、测试、试运行
6.运行和维护:系统运行和数据库维护、评估调整
数据库三级模式+两级映像
1.模式(Schema)
模式也称为逻辑模式,是数据库中全体数据在逻辑上的图。通常以某种数据模型为基础,定义数据库中全部数据的逻辑结构如:数据记录的名称,数据项的名称,类型,值域等。
模式使开发者可以看见和使用全部的数据的逻辑结构和特征描述
注意:
模式不是数据本身,仅描述数据库的结构。不涉及硬件环境和物理存储细节,也不与任何计算机语言有关。
数据库管理系统提供模式描述语言(模式DDL)来定义模式。
模式DDL给出一个数据库逻辑定义的全部语言便构成了该数据库的模式
2.外模式(External Schema)
外模式面向具体的应用程序
外模式也称子模式(Sub Schema)或者用户模式,是个别用户组的数据库视图。每个外模式描述的是一个特定用户感兴趣的数据部分,隐藏了数据库其他部分
外模式可以使用户看见和使用局部数据的逻辑结构和特征的描述
注意:
外模式是模式的子集,不同用户的外模式是不同的(可互相覆盖)。
一个程序只能启用一个外模式,但一个外模式可被多个应用程序使用,每个应用程序只能调用它的外模式所涉及的数据,其余的数据它是无法访问的。
数据库管理系统提供外模式描述语言(Sub-DDL)来描述外模式。Sub-DDL给出的用以定义一个用户数据视图的全部语句称为此用户的外模式。
3.内模式(Internal Schema)
内模式也称存储模式(Storage Schema)。即数据库全体数据的物理结构、存储方法、存取策略(路径,包括索引)。内模式与数据存储的软件和硬件环境是有关的。
注意:
数据库管理系统提供内模式描述语言(内模式DDL)来描述和定义内模式。
对于一个数据库来说只有一个模式和一个内模式,但可以有多个外模式。实际的数据库与内模式对应,应用程序则与外模式有关。
模式/内模式映像是唯一的,但有多个外模式/模式映像,每一个外模式都有一个外模式/模式映像(包含在该外模式定义中)。
两级映像
数据的独立性是指数据与程序独立,将数据的定义从程序中分离出来,由DBMS(数据库管理系统)负责数据的存储,从而简化应用程序,大大减少应用程序编制的工作量
两级映像保证了数据的独立性,数据独立性分为物理独立性和逻辑独立性
1.外模式/模式映像---保证逻辑独立性
当数据库(逻辑)模式发生改变时,应用程序(外模式)不需改变。通过修改外模式/模式映像实现
2.模式/内模式映像---保证物理独立性
当数据库内模式发生改变时,逻辑模式不用改变,进而保证应用程序(外模式)不需改变。通过修改外模式/内模式映像实现
视图
视图是一个虚拟表,其查询的数据来自于视图定义时的 as select xx 查询语句。视图的列来自于一个表或多个表,所以视图不可以和表名重名
数据多用作查询,一般不会通过视图去修改数据
关系型数据库执行CREAT VIEW的时候,只是把视图定义存入数据字典,并不执行其中的SELECT
视图的作用
1.视图能简化用户的操作
我们可以为常用的sql语句创建一个视图,这样我们原来需要连多个表,现在操作一个表就好了。
当一个查询你需要频频的作为子查询使用时,视图可以简化代码,直接调用而不是每次都去重复写这个东西。
2.视图能够增加安全性
我们可以给不同的用户定义不同的视图,屏蔽了底层的表结构,从而更好的保护了数据的安全性。降低了如sql注入的风险。
3视图对重构数据库提供了一定程度的逻辑独立性
数据的物理独立性是指用户的应用程序不依赖于数据库的物理结构。数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有的关系增加新的字段,用户的应用程序不会受影响。
【实例 】在 tb_students_info 表上创建一个名为 v_students_info 的视图,输入的 SQL 语句和执行结果如下所示。
mysql> CREATE VIEW v_students_info -> (s_id,s_name,d_id,s_age,s_sex,s_height,s_date) -> AS SELECT id,name,dept_id,age,sex,height,login_date -> FROM tb_students_info; Query OK, 0 rows affected (0.06 sec) mysql> SELECT * FROM v_students_info; +------+--------+------+-------+-------+----------+------------+ | s_id | s_name | d_id | s_age | s_sex | s_height | s_date | +------+--------+------+-------+-------+----------+------------+ | 1 | Dany | 1 | 24 | F | 160 | 2015-09-10 | | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 | | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 | | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 | | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 | | 6 | John | 2 | 21 | M | 172 | 2015-11-11 | | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 | | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 | | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 | | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 | +------+--------+------+-------+-------+----------+------------+ 10 rows in set (0.01 sec)
可以看到,view_students_info 和 v_students_info 两个视图中的字段名称不同,但是数据却相同。因此,在使用视图时,可能用户不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。
视图和表的区别与联系
区别:
1、视图是已经编译好的sql语句,而表不是。
2、视图没有实际的物理记录,而表有。
3、表是内容,视图是窗口。
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时四对它进行修改,但视图只能有创建的语句来修改。
5、表是内模式,试图是外模式。
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
9、不能对视图进行update或者insert into操作。
联系:
视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
总结:
视图是一个子查询,性能肯定会比直接查询要低(尽管sql内部有优化),所以使用视图时有一个必须要注意的,就是不要嵌套使用查询。尤其是复杂查询。