2nf算法
A. 要成为一名专业的程序员,从零开始需要怎么一步步来比较好,要把最底层的先学精通吗(个人认为)求学长
前言
你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)
建议:
不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。
回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。
一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。
一定要学会思考,思考为什么要这样,而不是那样。还要举一反三地思考。
注:你也许会很奇怪为什么下面的东西很偏Unix/linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:
现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。Windows的图形界面不吃香了。
越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。
微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。详情参见《Windows编程革命史》
所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。开发这边基本上没Windows什么事。
启蒙入门
1、 学习一门脚本语言,例如python/Ruby
可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。实践项目:
处理文本文件,或者csv (关键词 python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)
遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果
跟数据库打交道 (python sqlite),写一个小脚本统计数据库里条目数量
学会用各种print之类简单粗暴的方式进行调试
学会用Google (phrase, domain, use reader to follow tech blogs)
为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。
2、 用熟一种程序员的编辑器(不是IDE) 和一些基本工具
Vim / Emacs / Notepad++,学会如何配置代码补全,外观,外部命令等。
Source Insight (或 ctag)
使用这些东西不是为了Cool,而是这些编辑器在查看、修改代码/配置文章/日志会更快更有效率。
3、 熟悉Unix/Linux Shell和常见的命令行
如果你用windows,至少学会用虚拟机里的linux, vmware player是免费的,装个Ubuntu吧
一定要少用少用图形界面。
学会使用man来查看帮助
文件系统结构和基本操作 ls/chmod/chown/rm/find/ln/cat/mount/mkdir/tar/gzip …
学会使用一些文本操作命令 sed/awk/grep/tail/less/more …
学会使用一些管理命令 ps/top/lsof/netstat/kill/tcpmp/iptables/dd…
了解/etc目录下的各种配置文章,学会查看/var/log下的系统日志,以及/proc下的系统运行信息
了解正则表达式,使用正则表达式来查找文件。
对于程序员来说Unix/Linux比Windows简单多了。(参看我四年前CSDN的博文《其实Unix很简单》)学会使用Unix/Linux你会发现图形界面在某些时候实在是太难用了,相当地相当地降低工作效率。
4、 学习Web基础(HTML/CSS/JS) + 服务器端技术 (LAMP)
未来必然是Web的世界,学习WEB基础的最佳网站是W3School。
学习HTML基本语法
学习CSS如何选中HTML元素并应用一些基本样式(关键词:box model)
学会用 Firefox + Firebug 或 chrome 查看你觉得很炫的网页结构,并动态修改。
学习使用javascript操纵HTML元件。理解DOM和动态网页(Dynamic HTML: The Definitive Reference, 3rd Edition - O'Reilly Media) 网上有免费的章节,足够用了。或参看 DOM 。
学会用 Firefox + Firebug 或 chrome 调试Javascript代码(设置断点,查看变量,性能,控制台等)
在一台机器上配置Apache 或 Nginx
学习php,让后台PHP和前台HTML进行数据交互,对服务器相应浏览器请求形成初步认识。实现一个表单提交和反显的功能。
把PHP连接本地或者远程数据库 MySQL(MySQL 和 SQL现学现用够了)
跟完一个名校的网络编程课程(例如:http://www.stanford.e/~ouster/cgi-bin/cs142-fall10/index.php ) 不要觉得需要多于一学期时间,大学生是全职一学期选3-5门课,你业余时间一定可以跟上
学习一个javascript库(例如jQuery 或 ExtJS)+ Ajax (异步读入一个服务器端图片或者数据库内容)+JSON数据格式。
HTTP: The Definitive Guide 读完前4章你就明白你每天上网用浏览器的时候发生的事情了(proxy, gateway, browsers)
做个小网站(例如:一个小的留言板,支持用户登录,Cookie/Session,增、删、改、查,上传图片附件,分页显示)
买个域名,租个空间,做个自己的网站。
进阶加深
1、 c语言和操作系统调用
重新学C语言,理解指针和内存模型,用C语言实现一下各种经典的算法和数据结构。推荐《计算机程序设计艺术》、《算法导论》和《编程珠玑》。
学习(麻省理工免费课程)计算机科学和编程导论
学习(麻省理工免费课程)C语言内存管理
学习Unix/Linux系统调用(Unix高级环境编程),,了解系统层面的东西。
用这些系统知识操作一下文件系统,用户(实现一个可以拷贝目录树的小程序)
用fork/wait/waitpid写一个多进程的程序,用pthread写一个多线程带同步或互斥的程序。多进程多进程购票的程序。
用signal/kill/raise/alarm/pause/sigprocmask实现一个多进程间的信号量通信的程序。
学会使用gcc和gdb来编程和调试程序(参看我的《用gdb调试程序》)
学会使用makefile来编译程序。(参看我的《跟我一起写makefile》)
IPC和Socket的东西可以放到高级中来实践。
学习Windows SDK编程(Windows 程序设计 ,MFC程序设计)
写一个窗口,了解WinMain/WinProcere,以及Windows的消息机制。
写一些程序来操作Windows SDK中的资源文件或是各种图形控件,以及作图的编程。
学习如何使用MSDN查看相关的SDK函数,各种WM_消息以及一些例程。
这本书中有很多例程,在实践中请不要照抄,试着自己写一个自己的例程。
不用太多于精通这些东西,因为GUI正在被Web取代,主要是了解一下Windows 图形界面的编程。@virushuo 说:“ 我觉得GUI确实不那么热门了,但充分理解GUI工作原理是很重要的。包括移动设备开发,如果没有基础知识仍然很吃力。或者说移动设备开发必须理解GUI工作,或者在win那边学,或者在mac/iOS上学”。
2、学习Java
Java 的学习主要是看经典的Core Java 《Java 核心技术编程》和《Java编程思想》(有两卷,我仅链了第一卷,足够了,因为Java的图形界面了解就可以了)
学习JDK,学会查阅Java API Doc Java Platform SE 6
了解一下Java这种虚拟机语言和C和Python语言在编译和执行上的差别。从C、Java、Python思考一下“跨平台”这种技术。
学会使用IDE Eclipse,使用Eclipse 编译,调试和开发Java程序。
建一个Tomcat的网站,尝试一下JSP/Servlet/JDBC/MySQL的Web开发。把前面所说的那个PHP的小项目试着用JSP和Servlet实现一下。
3、Web的安全与架构
学习HTML5,网上有很多很多教程,以前酷壳也介绍过很多,我在这里就不罗列了。
学习Web开发的安全问题(参考新浪微博被攻击的这个事,以及Ruby的这篇文章)
学习HTTP Server的rewrite机制,Nginx的反向代理机制,fast-cgi(如:PHP-FPM)
学习Web的静态页面缓存技术。
学习Web的异步工作流处理,数据Cache,数据分区,负载均衡,水平扩展的构架。
实践任务:
使用HTML5的canvas 制作一些Web动画。
尝试在前面开发过的那个Web应用中进行SQL注入,JS注入,以及XSS攻击。
把前面开发过的那个Web应用改成构造在Nginx + PHP-FPM + 静态页面缓存的网站
4、学习关系型数据库
你可以安装MSSQLServer或MySQL来学习数据库。
学习教科书里数据库设计的那几个范式,1NF,2NF,3NF,……
学习数据库的存过,触发器,视图,建索引,游标等。
学习SQL语句,明白表连接的各种概念(参看《SQL Join的图示》)
学习如何优化数据库查询(参看《MySQL的优化》)
实践任务:设计一个论坛的数据库,至少满足3NF,使用SQL语句查询本周,本月的最新文章,评论最多的文章,最活跃用户。
5、一些开发工具
学会使用SVN或Git来管理程序版本。
学会使用JUnit来对Java进行单元测试。
学习C语言和Java语言的coding standard 或 coding guideline。(我N年前写过一篇关C语言非常简单的文章——《编程修养》,这样的东西你可以上网查一下,一大堆)。
推荐阅读《代码大全》《重构》《代码整洁之道》
高级深入
1、C++ / Java 和面向对象
我个人以为学好C++,Java也就是举手之劳。但是C++的学习曲线相当的陡。不过,我觉得C++是最需要学好的语言了。参看两篇趣文“C++学习信心图” 和“21天学好C++”
学习(麻省理工免费课程)C++面向对象编程
读我的 “如何学好C++”中所推荐的那些书至少两遍以上(如果你对C++的理解能够深入到像我所写的《C++虚函数表解析》或是《C++对象内存存局(上)(下)》,或是《C/C++返回内部静态成员的陷阱》那就非常不错了)
然后反思为什么C++要干成这样,Java则不是?你一定要学会对比C++和Java的不同。比如,Java中的初始化,垃圾回收,接口,异常,虚函数,等等。
实践任务:
用C++实现一个BigInt,支持128位的整形的加减乘除的操作。
用C++封装一个数据结构的容量,比如hash table。
用C++封装并实现一个智能指针(一定要使用模板)。
《设计模式》必需一读,两遍以上,思考一下,这23个模式的应用场景。主要是两点:1)钟爱组合而不是继承,2)钟爱接口而不是实现。(也推荐《深入浅出设计模式》)
实践任务:
使用工厂模式实现一个内存池。
使用策略模式制做一个类其可以把文本文件进行左对齐,右对齐和中对齐。
使用命令模式实现一个命令行计算器,并支持undo和redo。
使用修饰模式实现一个酒店的房间价格订价策略——旺季,服务,VIP、旅行团、等影响价格的因素。
学习STL的用法和其设计概念 - 容器,算法,迭代器,函数子。如果可能,请读一下其源码。
实践任务:尝试使用面向对象、STL,设计模式、和WindowsSDK图形编程的各种技能
做一个贪吃蛇或是俄罗斯方块的游戏。支持不同的级别和难度。
做一个文件浏览器,可以浏览目录下的文件,并可以对不同的文件有不同的操作,文本文件可以打开编辑,执行文件则执行之,mp3或avi文件可以播放,图片文件可以展示图片。
学习C++的一些类库的设计,如: MFC(看看候捷老师的《深入浅出MFC》) ,Boost, ACE, CPPUnit,STL (STL可能会太难了,但是如果你能了解其中的设计模式和设计那就太好了,如果你能深入到我写的《STL string类的写时拷贝技术》那就非常不错了,ACE需要很强在的系统知识,参见后面的“加强对系统的了解”)
Java是真正的面向对象的语言,Java的设计模式多得不能再多,也是用来学习面向对象的设计模式的最佳语言了(参看Java中的设计模式)。
推荐阅读《Effective Java》 and 《Java解惑》
学习Java的框架,Java的框架也是多,如Spring, Hibernate,Struts 等等,主要是学习Java的设计,如IoC等。
Java的技术也是烂多,重点学习J2EE架构以及JMS, RMI, 等消息传递和远程调用的技术。
学习使用Java做Web Service (官方教程在这里)
实践任务: 尝试在Spring或Hibernate框架下构建一个有网络的Web Service的远程调用程序,并可以在两个Service中通过JMS传递消息。
C++和Java都不是能在短时间内能学好的,C++玩是的深,Java玩的是广,我建议两者选一个。我个人的学习经历是:
深究C++(我深究C/C++了十来年了)
学习Java的各种设计模式。
2、加强系统了解
重要阅读下面的几本书:
《Unix编程艺术》了解Unix系统领域中的设计和开发哲学、思想文化体系、原则与经验。你一定会有一种醍醐灌顶的感觉。
《Unix网络编程卷1,套接字》这是一本看完你就明白网络编程的书。重要注意TCP、UDP,以及多路复用的系统调用select/poll/epoll的差别。
《TCP/IP详解 卷1:协议》- 这是一本看完后你就可以当网络黑客的书。了解以太网的的运作原理,了解TCP/IP的协议,运作原理以及如何TCP的调优。
实践任务:
理解什么是阻塞(同步IO),非阻塞(异步IO),多路复用(select, poll, epoll)的IO技术。
写一个网络聊天程序,有聊天服务器和多个聊天客户端(服务端用UDP对部分或所有的的聊天客户端进Multicast或Broadcast)。
写一个简易的HTTP服务器。
《Unix网络编程卷2,进程间通信》信号量,管道,共享内存,消息等各种IPC…… 这些技术好像有点老掉牙了,不过还是值得了解。
实践任务:
主要实践各种IPC进程序通信的方法。
尝试写一个管道程序,父子进程通过管道交换数据。
尝试写一个共享内存的程序,两个进程通过共享内存交换一个C的结构体数组。
学习《Windows核心编程》一书。把CreateProcess,Windows线程、线程调度、线程同步(Event, 信号量,互斥量)、异步I/O,内存管理,DLL,这几大块搞精通。
实践任务:使用CreateProcess启动一个记事本或IE,并监控该程序的运行。把前面写过的那个简易的HTTP服务用线程池实现一下。写一个DLL的钩子程序监控指定窗口的关闭事件,或是记录某个窗口的按键。
有了多线程、多进程通信,TCP/IP,套接字,C++和设计模式的基本,你可以研究一下ACE了。使用ACE重写上述的聊天程序和HTTP服务器(带线程池)
实践任务:通过以上的所有知识,尝试
写一个服务端给客户端传大文件,要求把100M的带宽用到80%以上。(注意,磁盘I/O和网络I/O可能会很有问题,想一想怎么解决,另外,请注意网络传输最大单元MTU)
了解BT下载的工作原理,用多进程的方式模拟BT下载的原理。
3、系统架构
负载均衡。HASH式的,纯动态式的。(可以到Google学术里搜一些关于负载均衡的文章读读)
多层分布式系统 – 客户端服务结点层、计算结点层、数据cache层,数据层。J2EE是经典的多层结构。
CDN系统 – 就近访问,内容边缘化。
P2P式系统,研究一下BT和电驴的算法。比如:DHT算法。
服务器备份,双机备份系统(Live-Standby和Live-Live系统),两台机器如何通过心跳监测对方?集群主结点备份。
虚拟化技术,使用这个技术,可以把操作系统当应用程序一下切换或重新配置和部署。
学习Thrift,二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。
学习Hadoop。Hadoop框架中最核心的设计就是:MapRece和HDFS。MapRece的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释MapRece就是“任务的分解与结果的汇总”。HDFS是Hadoop分布式文件系统(Hadoop Distributed File System)的缩写,为分布式计算存储提供了底层支持。
了解NoSQL数据库(有人说可能是一个过渡炒作的技术),不过因为超大规模以及高并发的纯动态型网站日渐成为主流,而SNS类网站在数据存取过程中有着实时性等刚性需求,这使得目前NoSQL数据库慢慢成了人们所关注的焦点,并大有成为取代关系型数据库而成为未来主流数据存储模式的趋势。当前NoSQL数据库很多,大部分都是开源的,其中比较知名的有:MemcacheDB、Redis、Tokyo Cabinet(升级版为Kyoto Cabinet)、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。
B. 数据库原理的另外版本
作者:孔丽红 主编,游晓明 钟伯成 张瑜 参编
定价:49元印次:1-1ISBN:9787302398813出版日期:2015.08.01印刷日期:2015.07.31 本书是作者结合多年教学经验编写而成的,以数据库应用实例贯穿于各章节,突出理论与应用的结合。
本书详细介绍了数据库技术的基本原理、方法和应用技术,共分11章,具体内容如下:
第1章数据库系统概述,介绍了数据库技术的发展,数据库管理系统的功能、组成、模式结构,概念数据模型和几种常用的结构数据模型。
第2章实体联系模型,通过大量实例介绍了实体联系模型的基本要素、绘制的步骤和方法。
第3章关系数据模型与关系运算,主要介绍了关系模型的数据结构、完整性,以及关系代数、元组关系演算、域关系演算和查询优化。
第4章关系数据库标准语言SQL,介绍了SQL的全貌,包括数据操作语言(DML)、数据控制语言(DCL)和数据定义语言(DDL)。
第5章关系数据库设计理论,介绍如何设计关系模式问题,包括数据依赖、无损分解和保持函数依赖的分解,1NF、2NF、3NF、BCNF、4NF和5NF等。
第6章数据库设计,通过一个图书管理系统设计实例,详细介绍了数据库设计各阶段的内容、任务、设计步骤及方法等。
第7章数据库安全保护,主要从安全性控制、完整性控制、并发性控制和数据库恢复四方面介绍了数据库的安全保护功能。
第8章关系数据库管理系统SQLServer2005,在介绍SQLServer2005的集成开发环境基础上,以大量的实例讲解SQLServer2005的知识和技术,包括数据库及其对象的管理、SQLServer2005的安全管理机制、数据库的备份与还原、数据的导入和导出、数据的附加和分离、数据库活动的监视等。
第9章基于VisualBasic的关系数据库应用系统开发,在介绍VisualBasic(VB)集成开发环境、语法结构的基础上,以“图书管理系统”的开发过程为例,由浅入深地介绍了使用VB开发数据库应用系统的步骤和方法,使初学者能很快利用VB开发一个数据库应用系统。
第10章数据库技术的发展,对分布式数据库、并行数据库、面向对象数据库等进行了介绍。
第11章数据库实验,本章共设计了数据库的创建与管理、表的创建与管理、访问与修改数据、视图与索引、存储过程与触发器、SQLServer2005的安全与保护、利用VB开发图书管理系统共7个实验,用于配合课堂教学,培养学生的实践能力。
全书内容丰富、叙述流畅,概念严谨清楚,注重理论联系实际,涵盖了目前数据库的实用理论和应用技术。在每一章节理论介绍的基础上,都给出大量实例,并进行解释说明,加强对数据库基本原理、方法的理解和掌握。
每章后均有各种类型的习题,检查学生对基本知识的掌握程度。另外,还有课件、习题解答和实验解答等电子材料,帮助读者了解和掌握所学知识点。读者在掌握数据库系统基本原理及数据库设计方法后,可进一步了解数据库应用系统开发设计的方法。本书可作为高等院校计算机、信息技术等专业的数据库课程教材,也可供从事信息领域工作的科技人员和其他有关人员参阅。
编写分工为:第5章和第10章由钟伯成编写;第1、7章由游晓明编写,张瑜提出修改意见;其余部分均由孔丽红编写。在编写过程中,得到了上海工程技术大学电子电气工程学院领导和计算机系诸位老师的指导。限于水平,书中若有欠妥之处,请广大读者和专家批评指正。
本书作者联系方式如下:
孔丽红,上海工程技术大学电子电气工程学院
编者
2015年3月 第1章数据库系统概述
1.1引言
1.1.1信息
1.1.2数据
1.2数据库技术的产生、发展
1.2.1人工管理阶段
1.2.2文件系统阶段
1.2.3数据库系统阶段
1.3数据库系统的组成和结构
1.3.1数据库、数据库管理系统和数据库系统
1.3.2数据库系统的体系结构
1.4数据模型
1.4.1概念模型
1.4.2层次模型
1.4.3网状模型
1.4.4关系模型
1.4.5面向对象模型
1.5小结
1.6习题
第2章实体联系模型
2.1概述
2.2实体
2.3属性
2.4联系
2.4.1二元联系的三种类型
2.4.2多元联系
2.4.3实体集内部的联系
2.5弱实体
2.6实体联系模型的绘制实例
2.7小结
2.8习题
第3章关系数据模型与关系运算
3.1关系模型概述
3.1.1关系的形式化定义及其有关概念
3.1.2关系的性质
3.1.3关系、关系模式、关系子模式和存储模式
3.1.4关系数据库与关系数据库模式
3.2关系的键与关系的完整性
3.2.1超键、候选键、主键和外键
3.2.2关系的完整性
3.3从ER模型到关系模型
3.3.1实体的转换规则
3.3.2联系的转换规则
3.3.3ER模型转变成关系模型实例
3.4关系代数
3.4.1传统的集合运算
3.4.2专门的关系运算
3.4.3扩充的关系代数操作
3.4.4关系代数表达式实例
3.5关系演算
3.5.1元组关系演算
3.5.2域关系演算
3.6关系代数表达式的优化
3.6.1查询优化的总目标
3.6.2关系代数表达式的等价变换规则
3.6.3关系代数表达式的优化算法
3.7小结
3.8习题
第4章关系数据库标准语言SQL
4.1SQL语言简介
4.1.1SQL的特点
4.1.2SQL语言的基本组成
4.1.3实例数据库
4.2数据定义
4.2.1数据库的创建与删除
4.2.2基本表的创建、删除与修改
4.2.3索引的创建、删除与修改
4.3数据查询
4.3.1SELECT语句的一般格式和单表查询
4.3.2聚合函数和分组查询
4.3.3多表联接查询
4.3.4多表嵌套查询
4.4视图的创建、删除与修改
4.5数据更新
4.5.1数据的插入
4.5.2数据的删除
4.5.3数据的修改
4.6存储过程和触发器
4.6.1存储过程的定义、修改和删除
4.6.2触发器的定义、修改和删除
4.7小结
4.8习题
第5章关系数据库设计理论
5.1关系模式规范化的必要性
5.1.1关系模式的定义
5.1.2规范化的必要性
5.2函数依赖
5.2.1函数依赖的定义及其推理规则
5.2.2函数依赖集的闭包
5.2.3属性集的闭包
5.2.4函数依赖与关系的候选键、主键之间的联系
5.3关系模式的分解特性
5.3.1无损分解
5.3.2保持函数依赖的分解
5.4关系模式的范式
5.5多值依赖与4NF
5.5.1多值依赖
5.5.24NF
5.6连接依赖与5NF
5.7小结
5.8习题
第6章数据库设计
6.1数据库设计概述
6.1.1数据库设计的方法
6.1.2数据库设计的步骤
6.2需求分析
6.2.1需求分析的内容和方法
6.2.2需求分析的步骤
6.2.3数据字典
6.3数据库概念设计
6.3.1概念设计的方法及步骤
6.3.2数据抽象与局部视图设计
6.3.3视图集成
6.3.4全局ER模型的优化、评审
6.4逻辑结构设计
6.4.1概念模型向关系模型的转换
6.4.2关系模型的优化
6.4.3外模式的设计
6.5数据库物理设计
6.5.1数据库物理设计的内容
6.5.2数据库存储结构的确定
6.5.3关系模式存取方法的选择
6.5.4评价物理结构
6.6数据库的实施
6.7数据库的运行和维护
6.8小结
6.9习题
第7章数据库安全保护
7.1数据库的安全性
7.2数据库的完整性
7.2.1完整性约束条件
7.2.2完整性控制
7.2.3数据库完整性设计原则
7.3数据库的并发控制技术
7.3.1事务
7.3.2并发控制所带来的问题
7.3.3封锁
7.3.4并行调度的可串行化
7.4数据库的恢复
7.4.1数据库恢复的原理及其实现技术
7.4.2检查点技术
7.4.3故障种类和恢复的方法
7.4.4数据库镜像
7.5小结
7.6习题
第8章关系数据库管理系统SQLServer2005
8.1SQLServer2005概述
8.1.1SQLServer2005发展简史
8.1.2SQLServer2005的安装与配置
8.1.3SQLServer2005的体系结构
8.2SQLServer2005的管理工具
8.2.1SQLServer配置管理器
8.2.2SQLServerManagementStudio
8.2.
8.2.
8.2.5文档和教程
8.2.6SQLServer2005命令提示实用工具
8.3管理数据库
8.3.1SQLServer2005数据库概述
8.3.2数据库的管理
8.3.3表的管理
8.3.4数据表约束和数据完整性控制
8.3.5索引的创建与维护
8.3.6数据的插入、修改、删除和查询
8.3.7视图的管理
8.4SQLServer2005的安全管理机制
8.4.1安全性问题和安全性机制之间的关系
8.4.2管理身份认证方式
8.4.3管理安全账户
8.4.4管理数据库用户
8.4.5权限管理
8.4.6管理数据库角色
8.5存储过程和触发器
8.5.1存储过程的管理
8.5.2触发器的管理
8.6数据库备份与恢复
8.6.1数据库备份
8.6.2数据库的恢复
8.6.3数据库备份计划
8.7数据导入和导出
8.8附加和分离数据库
8.9SQLServerProfiler
8.10小结
8.11习题
第9章基于VisualBasic的关系数据库应用系统开发
9.1VisualBasic语言简介
9.1.1VisualBasic开发环境
9.1.2用VisualBasic开发应用程序
9.2VisualBasic语言基础和程序设计
9.2.1常数、变量、运算符和表达式
9.2.2基本控制结构
9.2.3常用内部函数
9.2.4输入与输出
9.2.5数组
9.3用户界面的设计
9.3.1基本概念
9.3.2窗体的创建
9.3.3控件
9.3.4菜单设计
9.4数据库应用
9.4.1ADO
9.4.2数据绑定控件
9.4.3报表设计
9.5开发实例——图书管理系统
9.5.1用户登录模块
9.5.2用户管理模块
9.5.3编辑模块
9.5.4查询模块
9.5.5借书还书模块
9.6小结
9.7习题
第10章数据库技术的发展
10.1概述
10.2分布式数据库系统
10.2.1基本概念
10.2.2分布式数据库系统结构
10.2.3分布式数据库设计
10.2.4分布式数据库的特点与发展方向
10.3并行数据库系统
10.3.1基本概念
10.3.2并行数据库系统结构
10.3.3并行数据库的特点及待解决的问题
10.4面向对象的数据库系统
10.4.1基本概念
10.4.2面向对象数据库系统关键技术
10.4.3面向对象数据库的实现方法
10.4.4面向对象数据库的特点
10.4.5面向对象数据库系统的未来发展
10.5面向应用领域的数据库技术
10.5.1工程数据库
10.5.2空间数据库
10.5.3科学数据库
10.6小结
10.7习题
第11章数据库实验
11.1数据库的创建与管理(实验一)
11.2表的创建与管理(实验二)
11.3访问与修改数据(实验三)
11.4视图与索引(实验四)
11.5存储过程与触发器(实验五)
11.6SQLServer2005的安全与保护(实验六)
11.7利用VB开发图书管理系统(实验七)
参考文献
C. 在线.等..关系数据库规范化理论
8.2 规范化理论
关系数据库中关系规范化问题在1970年Godd提出关系模型时就同时被提出来,关系规范化可按属性间不同的依赖程度分为第一范式,第二范式,第三范式,Boyce-Codd范式以及第四范式.人们对规范化的认识是有一个过程的,在1970年时已发现属性间的函数依赖关系,从而定义了与函数依赖关系有关的第一,第二,第三,及Boyce-Codd范式.在1976~1978年间,Fagin,Delobe以及Zanjolo发现了多值依赖关系,从而定义了与多值依赖有关的第四范式.
范式的定义与属性间的依赖关系的发现有密切关系,在本节中我们介绍函数依赖与多值依赖这两个概念,并在此基础上定义第一范式,第二范式,第三范式,Boyce-Codd范式以及第四范式.
8.2.1 函数依赖
函数依赖(functional dependency)是关系模式内属性间最常见的一种依赖关系,例如在关系模式S中,S#与Sd间有一种依赖关系.即S#的值一经确定后Sd的值也随之唯一地确定了,此时即称S#函数决定Sd或称Sd函数依赖于S#,它可用下面符号表示:
S# → Sd
同样,我们还可以有:
S# → Sa
S# → Sn
但是关系模式SC中的S#与G间则没有函数依赖关系,因为一个确定的学号S#可以允许有多个成绩(它们分别对应于不同的课程),因此成绩G并不能唯一地确定,但是(S#,C#)与G间则存在着函数依赖关系,即有:
(S#,C#)→G
函数依赖这个概念是属语义范畴的,我们只能根据语义确定属性间是否存在这种依赖,此外别无它法可循.
定义8-1 设有关系模式R ( U ),X,Y是U的子集,若对于任一个关系R中的任一元组在X中的属性值确定后则在Y中的属性值必确定,则称Y函数依赖于X或称X函数决定Y, 并记作X→Y,而其中X称为决定因素,Y称为依赖因素.对于函数依赖,我们一般总是使用一种叫非平凡的函数依赖,在本章中如无特殊声明,凡提到函数依赖时总认为指的是非平凡的函数依赖.下面我们对非平凡函数依赖下一个定义.
定义8-2 一个函数依赖关系X→Y如满足Y(X,则称此函数依赖是非平凡的函数依赖.
为了对函数依赖作深人研究,也为了规范化的需要,我们还得引入几种不同类型的函数依赖.
首先;引入一种完全函数依赖的概念,这个概念为真正的函数依赖打下基础.例如在S申我们有S#→Sd,因而我们同样也会有:
(S#,Sn) →Sd
(S#,Sa) →Sd
比较这三种函数依赖后我们会发现,实际上真正起作用的函数依赖是:
S#→Sd
而其他两种函数依赖都是由它派生而成的,即是说在函数依赖中真正起作用的是S#,而不是Sn或Sa等.这样,我们在研究函数依赖时要区别这两种不同类型的函数依赖,前一种叫完全函数依赖,而后一种叫不完全函数依赖.
定义8-3 R( U )中如有X,Y(U,满足X→Y且对任何X的真子集X',都有X'→Y',则称Y完全函数依赖于X并记作:
X Y
定义8-4 在R( U )中如有X,Y(U且满足X→Y,但Y不完全函数依赖于X,则称Y部分依赖于X,并记作:
X Y
由上所述可知,Sd完全函数依赖于S#,但Sd不完全函数依赖于(S#,Sn),亦即有:
S# Sd
(S#,Sn) Sd
(S#,Sa) Sd
在函数依赖中还要区别直接函数依赖与间接函数依赖这两个不同的概念,例如S#→Sd中Sd是直接函数依赖于S#,但如果在属性中尚有系的电话号码DT(假如每个系有唯一的一个电话号码),则有:Sd→DT,从而由S#→Sd及Sd→DT可得到:
S# →DT
在这个函数依赖中,DT并不直接函数依赖于S#,而是经过中间属性Sd传递而依赖于S#,亦即是DT直接依赖于Sd,而Sd又直接依赖于S#,从而构成了DT依赖于S#.这种函数依赖关系,是一种间接依赖关系,或叫传递依赖关系.我们可以对它定义如下.
定义8-5在R( U )中如有X,Y,Z(U且满足:
X→Y,(Y(X ) Y / X,Y→Z
则称Z传递函数依赖于X,否则,称为非传递函数依赖.
注意,在这里传递函数依赖与非传递函数依赖仅作概念上区别, 在形式表示上不作任何区别,即Z传递函数依赖于X或Z非传递函数依赖于X都用X→Z表示,这样做的目的也是为了从全局考虑使得表示尽量简单与方便.
定义了几种不同的函数依赖关系后,我们在此基础上继续定义一些十分重要的基本概念.即有关关键字(keY)的一些概念.
定义8-6 在R(U )中如有K(U且满足:
K U
则称K为R的关键字.
一个关系模式可以有若干个关键字,我们在使用中选取其中的一个就够了,这个被选中的关键字叫做这个关系模式的主关键字(Prime key),而一般的关键字叫候选关键字(candidate key).
在关系模式S,C,SC中,S的关键字是S#,C的关键字是C#,而SC的关键字是(S#,C#),因为我们有:
S# (S#,Sn,Sd,Sa)
C# (C#,CN,P#)
(S#,C#) (S#,C#,G)
而S中,(S#,Sn),(S#,Sd)等均不是关键字,因为我们有:
(S#,Sn) (S#,Sn,Sd,Sa)
(S#,Sd) (S#,Sn,Sd,Sa)
在一个关系模式中,所有关键字中的属性构成一个集合,而所有其余的属性则构成另一个集合,这两个集合分别叫做这个关系模式的主属性集与非主属性集.主属性集中的属性叫做主属性(prime attribute),非主属性集中的属性则叫非主属性(nonprime attribute).例如在关系模式S (S#,Sn,Sd,Sa)中, 主属性集为:
(S#) .
而非主属性集为:
(Sn,Sd,Sa)
在SC(S#,C#,G)中,主属性集为:
{ S#, C# }
而非主属性为:
{G}
下面我们给出它们的定义:
定义8-7 R ( U )中所有关键字中的属性构成的集合P称为R(U )的主属性集.
定义8-8 在R ( U )中所有非关键字中的属性构成的集合N称为R(U)的非主属性集.以上建立了一系列与函数依赖有关的概念,有了它们后就可以讨论与函数依赖有关的几
个范式,它们是第一范式,第二范式及第三范式(实际上第一范式与所有依赖均无关,但为叙述方便起见,可视为与函数依赖有关).至于函数依赖的有关理论的探讨,将在本章稍后部分再作详细介绍.
8.2.2 与函数依赖有关的范式
在这节中我们讨论四种范式,他们是第一范式,第二范式,第三范式以及Boyce-Codd范式.
先介绍第一范式.第一范式是关系模式所要遵循的基本条件,即关系中的每个属性值均必须是一个不可分割的数据量.如一个关系模式满足此条件则称它属于第一范式(first normal form,或简写成lNF),一个关系模式R如满足第一范式,则可记为R∈lNF.
第一范式规定了一个关系中的属性值必须是一个不可分割的数据,它排斥了属性值为元组,数组或某种复合数据等的可能性,使关系数据库中的所有关系的属性值均是最简单的,这样可以做到结构简单,讨论方便.一般说来,每个关系模式均要满足第一范式,因为这是对每个关系的最基本要求.
下面开始讨论真正与函数依赖有关的三个范式.为了讨论这几个范式,我们一般对一个关系模式除了要确定其属性外,还要根据它的语义确定在这个模式上的所有函数依赖.设有关系模式R,它有属性集U,而在它上的函数依赖集是F,则此时一个关系模式可由三元组R,U,F确定,它可以写成为:
R ( U,F )
注意,这个表示式仅表示一个三元组而已,它并不表示谓词或关系.例如前面所提到的学生关系模式S,它可表示为:
S ({S#,Sn,Sd,Sa},{S#→Sn,S#→Sd,S#→Sa})
又如有一个关系模式叫SCG',它由属性S#,Sn,Sd,Sa, C#, G 组成,其中Ss表示学生所学专业,其他含义同前.在这个关系模式中有一些语义信息,它们是:
(1 ) 每个学生均只属一个系与一个专业;
(2 ) 每个学生修读之每门课有且仅有一个成绩;
(3 ) 各系无相同专业.
根据上述语义信息以及其他的一些基本常识,我们可以将它们用函数依赖形式表示出来,它们是:
S#→Sn
S#→Sd
S#→Ss
Ss→Sd
(S#,C#)→G
因此,这个关系模式的有关信息可写成为:
SCG'({S#,Sn,Sd,Ss,C#,G},{ S#→Sn,S#→Sd,S#→Ss, Ss S#→Sd, (S#,C# ) →G}
关系模式有了函数依赖后就可以讨论规范化的问题了.关系中的每一级范式均提出了关系模式所要遵循的约束条件,目的是为了使得关系模式具有较少异常性与较小的冗余度,即是说使关系模式更"好"一些.
下面讨论第二范式.
定义8-9 设有R(U)∈lNF且其每个非主属性完全函数赖于关键字,则称R(U)满足第二范式(可简写为2NF)或写为R∈2NF.
实际上并不是每个满足第一范式的关系模式必满足第二式,如前面例子中的关系模式SCG'即不满足第二范式.这是因在SCG'中,它的关键字是(S#,C#),而它的非主属性集是:
(Sd,G,Sn,Ss)
虽然我们有:
(S#,C#) G
但是Sn,Sd,Ss均并不完全依赖(S#,C#),因此不满足第二范式的条件.
一个关系模式若满足第二范式,则它必须具有较少异常与较小冗余度.因此,一个关系模式若仅满足第一范式还不够,它必须满足第二范式,其方法是将一个关系模式分解成几个关系模式,使分解后的关系模式能满足第二范式.如关系模式SCG'可分解成两个关系模式,它们是:
SCG'l ({S#,C#,G},{( S#,C#)→G})
SCG'2 ({S#,Sn,Sd,Ss},{S#→Sn,S#→Sd,S#→Ss→Sd})
这两个模式SCG'均可用图8-1所示的示意图表示之.
模式SCG'I与SCG'2均满足第二范式,它们均有较少异常与较小冗余度,而SCG'l还可以做到无插人与删除异常的出现,而SCG'由于不满足第二范式,因此插入异常,删除异常均有存在,且数据冗余度也很大.关于这方面的验证请读者自己去做.
(a) SCG'示意图 (b)SCG'1及SCG'2示意图
图8-1 三个关系模式函数依赖示意图
但是,第二范式还不能完全避免异常现象的出现,如SCG'2虽满足第二范式,但仍会出现插入异常与删除异常.如在SCG'2中,它有如表8-4所示的模式.
表8-4 SCG'2的关系模式
S#
Sn
Sd
Ss
SCG'2:
在这个模式中,如果我们要登记一个尚未招生的系的专业设置情况,要插入这个情况在模式中是较为困难的.这样,如果要删除一些学生,有可能会将有关系的专业设置情况一起删除.究其原因,不外是因为Sd既函数依赖于S#又函数依赖于Ss,同时Ss又函数依赖于S#,并且由此引起了传递函数依赖的出现.因此,看来要消除异常现象,必须使关系模式中无传递函数依赖现象出现,这样就产生了第三范式.
第三范式要求关系模式首先得满足第二范式,同时每个非主属性都非传递依赖于关键字.由此可以看出,如满足第三范式则每个非主属性既不部分依赖也不传递依赖于关键字.
定义8-10 若关系模式R(U)的每个非主属性都不部分依赖也不传递依赖于关键字,则称R满足第三范式(可简写为3NF),并记作R∈3NF.
第三范式将关系模式中的属性分成为两类,一类是非主属性集,另一类是主属性集,而非主属性集的每个属性均完全,不传递依赖于主属性集中的关键字,从而做到在关系模式中理顺了复杂的依赖关系,使依赖单一化与标准化,进而力求达到避免异常性的出现,其示意图可见图8-2,在图中可将关系模式比拟成一个原子,其中主属性集是这个原子的原子核,而非主属性集中的属性则是这个原子中的电子,它们紧紧依赖于主属性集构成一个紧密整体.
一个关系模式如果不满足第三范式,可以通过模式分解使分解成若干个模式,使分解后的模式能满足第三范式.例如关系模式SCG'中,SCG'2满足第二范式,但不满足第三范式,此时可将其分解成下面两个模式:
SCG'21(S#,Sn,Ss)
SCG'22 (Ss,Sd)
图8-2 第三范式的"原子"模型
其依赖示意图见图8-3.
(a)SCC'l (b)SCG'21 (c)SCG'22
图8-3模解分解图
在SCG'中经过几次分解后,得到三个关系模式:
SCG'l,SCG'21,SCG'22
这三个模式均满足第三范式且没有异常现象出现,同时冗余度小.
1972年Boyce,Codd等从另一个角度研究了范式,发现了函数依赖中的决定因素与关键字间的联系与范式有关,从而创立了另一种第三范式,称为Boyce-Codd范式.
Boyce-Codd范式的大概意思是:如果关系模式中,每个决定因素都是关键字,则满足Boyce-Codd范式.我们知道,一般而言,每个函数依赖中的决定因素不一定都是关键字,因此,只有当R中决定因素都是关键字时才能认为满足Boyce-Codd范式.
定义8-1l 如R(U )中X,Y(U,假定满足R∈lNF,且若X→Y(Y(X)时X必含关键字,则称R满足Boyce-Codd范式(可简记BCNF)并记以R∈BCNF.
下面一个问题我们需要研究BCNF与3NF间究竟有什么关系 经过仔细研究后,我们认为BCNF比3NF更为严格.下面的定理给出了这个回答.
定理8-1关系模式R(U)若满足BCNF,则必定满足3NF.
这个定理的证明请读者设法自行证得(注:可以用BCNF及3NF的定义而求得).
这个定理告诉我们:一关系模式满足BCNF者必满足3NF.但是,一关系模式满足3NF是否满足BCNF呢 即是说,定理8-1的充分条件是否成立呢 回答是否定的,即必存在一R(U)满足3NF,但不满足BCNF,这只要用一例即可说明.
例8-1设有关系模式R(S, C,T),其中S, C含义同前, T表示教师,R有下列语义信息: (1)每个教师仅上一门课;
(2)学生与课程确定后,教师即唯一确定.
这样,R就有如下函数依赖关系:
(S, C ) →T
T→C
这个关系模式满足3NF,因为它的主属性集为(S,C )非主属性集为 (T ),而T完全依赖于(S,C )且不存在传递依赖.但这个关系模式不满足BCNF,因为T是决定因素,但T不是关键字.
这个模式的示意图见图8-4.
图8一4 例8一1示意图
从这个例子中也可以看出,实际上第三范式也避免不了异常性,如某课程本学期不开设,因此就无学生选读,此时有关教师固定开设某课程的信息就无法表示.因此,要避免此种异常性,还需要进一步将关系模式分解成BCNF.如在此例中可将R进一步分解成:
R1 (S, T )
R2 (T, C )
其示意图如图8-5所示.而R1, R 2则为BCNF,这两个模式均不会产生异常现象.
R1 R 2
图8-5 R分解成两个BCNF
从上面所述可以看出,BCNF比3NF更为严格,它将关系模式中的属性分成两类,一类是决定因素集,另一类是非决定因素集.非决定因素集中的属性均完全,不传递地依赖于决定因素集中的每个决定因素.关于这种比喻的一个示意图见图8-6.
到此为止,由函数依赖所引起的异常现象,只要分解成BCNF即可获得解决.在BCNF中每个关系模式内部的函数依赖均比较单一和有规则,它们紧密依赖而构成一个整体,从而可以避免异现象出现以及冗余量过多的现象.
图8-6 BCNF的原子模型
8.2.3 多值依赖与第四范式
我们研究了函数依赖及与它有关的几个范式,但是否关系模式内属性间的依赖关系除函数依赖外就没有其他依赖关系呢 事实并不如此,函数依赖关系是一种较为明显的依赖关系,但是随着人们对关系模式了解越来越深刻后,发现尚有另外的一些依赖系存在,多值依赖就是其中的一种.我们先举一个例子,以说明多值依赖的存在.
例8-2设有一个课程关系C,它可用表8-5表示.此表表示高等数学这门课的任课教师可以有3个,它的参考书可以有2本;普通物理这门课的任课教师也可以有3个,它的参考书可以有3本.如用关系的形式表示,见表8-6.
表8-5 关系C的示意图
课程名C
教师名T
选用参考书L
高等数学
李华民
王天华
林 静
高等数学
高等数学教程
普通物理
吴铁钢
谢晓芳
徐秋芳
物理学
普通物理
普通物理基础
表8-6 C的关系
C
T
L
高等数学
李华民
高等数学
高等数学
李华民
高等数学教程
高等数学
王天华
高等数学
高等数学
王天华
高等数学教程
高等数学
林 静
高等数学
高等数学
林 静
高等数学教程
普通物理
吴铁钢
物理学
普通物理
吴铁钢
普通物理
普通物理
吴铁钢
普通物理基础
普通物理
谢晓芳
物理学
普通物理
谢晓芳
普通物理
普通物理
谢晓芳
普通物理基础
普通物理
徐秋芳
物理学
普通物理
徐秋芳
普通物理
普通物理
徐秋芳
普通物理基础
从这个关系中可以看出两点.
(1 ) 这个关系的数据冗余很大.
(2 ) 这个关系的属性间有一种有别于函数依赖的依赖关系存在.
我们仔细分析这种特殊依赖关系后发现它有两个特点:
(1)设如R(U)中X与Y有这种依赖关系,则当X的值一经确定后可以有一组Y值与之对应.如确定C为高等数学,则有一组T的值:李华民,王天华,林静与之对应.同样C与L也有类似的依赖.
(2 ) 当X的值一经确定后,其所对应的一组Y值与U一X一Y无关.如在C中,对应高等数学课的一组教师与此课程的参考书毫无关系,这就表示C与T有这种依赖,则T的值的确定与U一C一T= L无关.
上述这种依赖显然不是函数依赖,我们称之为多值依赖(multi-valued dependency),如Y多值依赖于X,则可记为X→→Y.
从上面所描述的多值依赖X→→Y的特点看,其第一个特点表示X与Y的对应关系是很随便的,X的一个值所对应的Y值的个数可不作任何强制性规定,即Y的值可以是从0到任意多个,其主要起强制性约束的是第二个条件,即X所对应的Y取值与U一X一Y无关,说得确切些,如有R(U)且如存在X→→Y,则对R(U)的任何一个关系R,如有元组s,t∈R,有s[X]=t[X](表示s与t在X的投影相等),如将它们在U一X一Y的投影(记为s[U一X一Y], t [U一X一Y],交换后所得元组称为u, v则必有u, v∈R
关于这个情况可以用表8-7表示.
表8-7多值依赖示意图
X
Y
U-X-Y
s s [X]
t t [X]
s [Y]
t [Y]
s[U-X-Y]
t[U-X-Y]
s [X]
t [X]
s [Y]
t [Y]
t[U-X-Y]
s[U-X-Y]
…………
…………
…………
…………
…………
…………
对多值依赖有了充分了解后,我们可对它定义如下:
定义8-12 设R(U)中有X,Y(U,若对R(U)的任何一个关系,对X的一个确定值,存在Y的一组值与之对应,且Y的这组值又与Z=U一X一Y中的属性值不相关,此时称Y多值依赖于X,并记为X→→Y.
在多值依赖中若X→→Y且Z=U一X一Y≠O,则称X→→Y为非平凡多值依赖,否则称为平凡多值依赖.
多值依赖可有下面的一些性质:
(1) 在R(U)中如有X→→Y,则必有X→→U一X一Y.
(2) 在R(U)中如有X→Y,则必有X→→Y.
读者要注意,我们在R(U)中讨论多值依赖时并不意味着R(U)中已不需要讨论函数依赖
了,恰恰相反,我们一般不仅要在R(U)找出所有多值依赖关系来,而且还要找出所有的函数依赖关系来.因此,一个完整的R(U)应该包含一个函数依赖集F'以及一个多值依赖集F',它可以用R(U, F,F')表示.
前面已经讲过,具有多值依赖的关系,它们的数据冗余量特别大,如何设法减少数据冗余呢 从例8-2中的关系C中可以看出,如果将C(C, T, L)分解成两个关系C1,C2后,它们的冗余度会明显下降.
C1 (C,T )
C2 (C,L )
C1,C2这两个关系可用表8-8表示.
表8-8关系C分解成关系C1和C2
C
T
高等数学
高等数学
高等数学
普通物理
普通物理
普通物理
李华民
王天华
林 静
吴铁钢
谢晓芳
徐秋芳
C
L
高等数学
高等数学
普通物理
普通物理
普通物理
普通物理
高等数学
高等效学教程
物理学
普通物理
普通物理基础
(a) 关系C1 (b) 关系C2
从表8-8可以看到,数据冗余的减少是极其明显的.
从多值依赖的观点看,在C1,C2中各对应一个多值依赖C→→T与C→→L,它们都是平凡多值依赖.因此,在多值依赖时,减少数据冗余的方法是使关系分解成为仅有平凡多值依赖.
这样,我们就可以规定一个比BCNF更高的范式,它叫第四范式,可简记为4NF.这个范式的特点是,在关系模式中它必须满足:
(1) 只允许出现平凡多值依赖(不允许出现非平凡多值依赖);
(2) 函数依赖要满足BCNF.
由于函数依赖是多值依赖的特例,因此统一可以用多值依赖概念定义第四范式.
定义8-13 R(U)中如果X→→Y是非平凡多值依赖,则X:必含有关键字,此时称R满足第四范式,并记作R∈4NF.
由这个第四范式定义可以看出,前面所定义的关系C,它虽是BCNF,但不是4NF,因为在C(C, T )中有:
C→→T
C→→L
而它的关键字是(C,T,L).
虽然C∈BCNF,但C不是关键字,所以C(4NF.对它作分解后所产生的C1及C2显然因为C1(C,T)有C→→T,故不存在非平凡多值依赖,因此有C1∈4NF,同理有C2∈4NF.
8.2.4 小 结
我们在规范化讨论中定义了五个范式,对这些范式的认识是逐步深入的.总的说来,我们可以总结成下面几点:
(1) 规范化的目的:解决插入,修改异常以及数据冗余度高.
(2) 规范化的方法:从模式中各属性间的依赖关系(函数依依赖及多值依赖)入手,尽量做到每个模式表示客观世界中的一个"事物".
(3) 规范化的实现手段:用模式分解的方法.
实际上从第一范式到第四范式的过程是一个不断消除一些依赖关系中的弊病的过程.图8-7给出了这个过程.
读者应注意的是:规范化是一种理论,它研究如何通过规范以解决异常与冗余现象,在实际数据库设计中构作关系模式时需要考虑到这个因素.但是,客观世界是复杂的,在构作模式时尚需考虑到其他的多种因素,如模式分解过多,势必在数据查询时要用到较多的联结运算,这样就会影响查询速度.因此,在实际构作模式中,需要综合多种正反因素,统一权衡利弊得失,最后构做出一个较为适合实际的模式来.
图8-7 规范化的过程
8.3 规范化所引起的一些问题
由规范化而引起了对一些问题的进一步研究,它们是:
1.函数依赖理论的研究
属性间的函数依赖与多值依赖是规范化的基本依据,因此有必要对它们作进一步研究,这些研究包括:
(1)可由关系模式上的一些函数依赖通过一些公理系统(叫Armstrong公理)而获得关系模式上的所有函数依赖.由此可知:一个关系模式上的所有函数依赖可由两部分组成:基础部分是直接由语义获取,其他部分可由公理系统推演而得.
(2)引入了函数依赖集的等价概念与最小函数依赖集,即如果两函数依赖集能推演出相同的集来,则称它们是等价的,而等价的函数依赖集之最小者称为最小函数依赖集.
这些研究为规范化提供了更多的基础信息.
2.模式分解的研究
规范化的实施主要依靠不断地进行模式分解.在模式分解中需要研究下列问题:
(1)分解后关系中的信息是否会丢失 这叫无损联接性(lossless join).
(2)分解后关系中的函数依赖是否会丢失 这叫依赖保持性.
(3)在满足无损联接性与依赖保持性下可分解到第几范式.
经过研究我们可以得到下面几个事实:
若要求满足无损联接性,则模式分解一定可以达到BCNF.
若要求满足依赖保持性,则模式分解一定可以达到3NF,但不一定能达到BCNF.
若既要求满足无损联接性又要求满足依赖保持性,则模式分解一定可以达到
3NF,但 不一定能达到BCNF.
上述三点均可通过三个算法获得实现.
由于规范化所引起的这两个问题的研究的详细探讨均比较复杂,故本书中不拟详述,仅将结果陈述于上,供读者参考.
习 题 8
1.请给出下列术语的含义:
函数依赖;(2)关键字;(3)主属性集;(4)多值依赖;(5)2NF;(6)3NF;
(7)BCNF;(8)4NF.
2.在关系SC(S#, C#, G)中S#((C#正确吗 请说明其理由.
3.是不是规范化最佳的模式结构是最好的结构 为什么
4.试证明若R(BCNF,则必有R(3NF.
5.试问下列关系模式最高属第几范式,并解释其原因.
R (A, B, C, D),F: {B(D, AB(C};
R (A, B, C),F: {A(B, B(A, A(C};
R (A, B, C, D),F: {A(C, D(B};
R (A, B, C, D),F: {A(C, CD(B}.
s
t
f
p
f
p
p
f
f
f
f
p
p
f
G
S#
C#
Sd
Ss
Sn
S#
C#
G
S#
Sd
Ss
Sn
非主属性集N
○
○
主属性集p
K1
K2
K3
K4
○
○
○
S#
c#
G
S#
Sn
Ss
Ss
Sd
S
C
T
C
T
T
S
非决定因素
决定
因素
R:
消除决定因素非关键字的非平凡多值依赖
1NF
消除非主属性对关键字的部分依赖
2NF
消除非主属性对关键字的传递依赖
3NF
消除主属性对关键字的部分与传递依赖
BCNF
消除非平凡且非函数依赖的多值依赖
4NF
D. 数据库与数据仓库的本质区别是什么
1、存放值区别:
数据库只存放在当前值,数据仓库存放历史值;
2、数据变化区别:
数据库内数据是动态变化的,只要有业务发生,数据就会被更新,而数据仓库则是静态的历史数据,只能定期添加、刷新;
3、数据结构区别:
数据库中的数据结构比较复杂,有各种结构以适合业务处理系统的需要,而数据仓库中的数据结构则相对简单;
4、访问频率不同:
数据库中数据访问频率较高,但访问量较少,而数据仓库的访问频率低但访问量却很高;
5、目标人群区别:
数据库中数据的目标是面向业务处理人员的,为业务处理人员提供信息处理的支持,而数据仓库则是面向高层管理人员的,为其提供决策支持;
E. 在系统实施中,数据库设计的原则
1. 原始单据与实体之间的关系
可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。
在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。
这里的实体可以理解为基本表。
〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。 这就是“一张原始单证对应多个实体”的典型例子。
2. 主键与外键
一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键 (因为它无子孙), 但必须要有外键(因为它有父亲)。
主键与外键的设计,在全局数据库的设计中,占有重要地位。主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。
3. 基本表的性质
基本表与中间表、临时表不同,因为它具有如下四个特性:
(1) 原子性。基本表中的字段是不可再分解的。
(2) 原始性。基本表中的记录是原始数据(基础数据)的记录。
(3) 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。
(4) 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。
理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。
4. 范式标准
基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。
为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。
〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式, 因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段, 可以提高查询统计的速度,这就是以空间换时间的作法。 在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和 “数量”这样的列被称为“数据列”。
5. 通俗地理解三个范式
通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解
三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降
低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理
数据模型设计时考虑。降低范式就是增加字段,允许冗余。
6. 要善于识别与正确处理多对多的关系
若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一
个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。这里的第三个
实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处
理多对多的关系。
〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一 个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。为此,要在二者之 间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外, 它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。
7. 主键PK的取值方法
PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义
的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引 占用空间大,而且速度也慢。
8. 正确认识数据冗余
主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。
〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。只有低级冗余才会增加数据的不一致性,因为同一数据,可 能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。
9. E--R图没有标准答案
信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是: 结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。
10 . 视图技术在数据库设计中很有用
与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的 一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、 提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。 若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。
对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完 成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。 并且规定,所有的程序员,一律只准在视图上操作。只有数据库管理员,带着多个人员共同掌握的“安全钥匙”, 才能直接在基本表上操作。
11. 中间表、报表和临时表
中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓 库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员 自己用程序自动维护。
12. 完整性约束表现在三个方面
域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通 过它定义字段的值城。
参照完整性:用PK、FK、表级触发器来实现。
用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。
13. 防止数据库设计打补丁的方法是“三少原则”
(1) 一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的 实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;
(2) 一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组 合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;
(3) 一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗 余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许 多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简 单,有的人就是不习惯、不采纳、不执行。 数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点, 不能孤立某一个原则。该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功 能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性) 的E--R图,要好得多。 提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成 为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。集成的程度越高,数据 共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。
提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。 “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的 原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”
设计数据库的理论依据。
14. 提高数据库运行效率的办法
在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
(1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。
(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方 式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
(3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键 PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
(4) 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
(5) 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。
总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。
上述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。
F. 请问,如何将如图所示的这张数据库表分割成符合第三范式(3NF)的几张表
1,范式
7大范式:1NF,2NF,3NF,BCNF,4NF,5NF,6NF
什么是标准化?非规范化?
规范化数据库的规范化,非规范化数据库的非规范化。
关键的一步是在设计,操作和维护的数据库,以确保数据正确分布到数据库表中。使用正确的数据结构不仅是简单的数据库访问操作,和其他应用程序内容(查询,窗体,报表,代码等)可以大大简化。正确的表设计的正式名称是“数据库规范化”。目的:为了减少数据库中的数据冗余,提高了数据的一致性。
范式的概念:
1)1NF的目标是为每一个列的表是不可分割的;
2)2NF:我们的目标是在每一行表被识别。前提是要满足1NF。关键字单场,你必须满足2NF。当关键字组合字段(即,多个字段),可以不存在确定的非键的一部分的字段中的关键字的组合中的一个领域。非部分地依赖于主磁场的主要领域,即,非键字段必须依赖于关键字的组合,而不是组合的一部分的关键字。
3)3NF:目标是不依赖于非键列的表内表的所有列。前提,以满足2NF,不存在非键字段决定另一个非键字段。即:有没有非关键属性传递依赖(X-> Y->非键属性Z)
4)BCNF:前提是要满足,2NF不存在非键字段决定另一个非关键字关键领域。也没有决定等重点领域的重点领域。 :3NF的基础上加上约束条件:这里有一个关键领域确定的另一个重要领域。
1第一范式(1NF)
任何关系数据库中,第一范式(1NF)是关系模型的基本要求,不符合第一范式(1NF)的数据库不是一个关系数据库。所谓第一范式(1NF)是基本的数据条目的数据库表的每一列是不可分割的,不能有一个以上的值在同一列中,这是一个实体的属性不能有一个以上的值或不能重复的属性。复制的属性,您可能需要定义一个新的实体,新的实体由重复的属性的新实体与原实体之间的一个一对多的关系。第一范式(1NF)表,每行只包含一个实例的信息。例如,图3-2中的员工信息表,不能在展会之一的员工信息,也可以两个或多个列中显示,员工信息表中的每一行代表一个员工信息,员工信息中只出现一次表。总之,第一范式是不重复的列。
第二范式(2NF)
第二范式(2NF)建立的第一范式(1NF),即满足第二范式(2NF)的基础上,必须满足第一范式(1NF )。第二范式(2NF)要求数据库表中的每个实例或行必须是唯一能够分辨。一般需要被添加到该表来实现的列之间的区别,唯一地标识每个实例来存储。图3-2(EMP_ID)的雇员数列中的员工信息表,因为每个员工的员工号是唯一的,因此每个员工都可以只区分。唯一的属性列被称为主键或主键,主码。第二范式(2NF)要求实体的属性完全依赖于主键。所谓完全依赖不能只依赖于主键属性的一部分,如果存在的话,那么这个属性,这部分应该被分离出来,形成一个新的实体,新实体与原实体的主键是一个一对多的关系。一般需要被添加到该表来实现的列之间的区别,唯一地标识每个实例来存储。总之,第二范式的非主属性部分依赖于主键。
3第三范式(3NF)
满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)请求不包含一个非主键信息包含在一个数据库表中的其他表。例如,有一个部门信息表,其中每个部门都有一个的部门编号(在DEPT_ID“),本部门,本部门的简要信息的名称。所以在部门列出的电话号码表中的图3-2中的员工可以不再被相关部门的信息部门名称,部门简要的员工信息表。部门信息表不存在,根据第三范式(3NF)应该构建它,否则会有大量的数据冗余。简而言之,第三范式就是属性不依赖于非主属性。例如:
第一范式(1NF):数据库表中的字段都是单一的财产,不能进行细分。单个属性由基本类型包括整数,实数,字符,逻辑型,日期型。
例如,数据库表是符合第一范式:场1场2场3场
这不符合第一范式的数据库表是不符合第2场3场1个字场4场31场32
显然,在任何关系型数据库管理系统(S),一个傻子不能让第一范式的数据库,因为这些S不会让你把一个数据库表,然后再除以分成两列或多列。因此,你要设计不符合第一范式的数据库,是不可能在现有的S.
第二范式(2NF):有没有非键字段在数据库表中的一部分,任何候选人函数依赖(部分函数依赖的存在为关键字段决定关键字的组合),即是一些领域的关键领域,所有的非键字段是完全依赖于任意一组候选关键字。
假定选课关系表中的SS(学号,姓名,年龄,课程名称,成绩,学分),关键字为组合关键字(学号,课程名称),因为存在之间的关系以下决定:
(学号,课程名称) - >(姓名,年龄,成绩,学分)
数据库表不符合第二范式,因为存在之间的关系如下决定: BR />(课程名称)→(学分)
(学号)→(姓名,年龄)
中的关键字的字段决定非关键字的组合。
一个学生选修,因为他们不符合2NF,这个选课关系表中有以下问题:1)数据冗余:同一门课程由n个学生选修,“学分”重复n-1次;课程名称和年龄对反复-1。 2)更新异常:调整课程的学分,数据表中的值的所有行的“学分”?必须更新,否则会出现同一门课程学分。 3)插入异常:假设你想创建一个新的课程,没有一门选修课。还没有“学号”关键字,课程名称和信用记录到数据库中。 4)删除异常:假设一组学生已完成课程选修记录应该从数据库表中删除。然而,在同一时间,也将被删除的过程名和信用信息。显然,这将导致插入异常。
选修的关系表SS变更为以下三个表:
学生们:锡(学号,姓名,年龄);
课程设置:(课程名称,学分);
选修关系:SS(学号,课程名称,成绩)。
这个数据库表是符合第二范式的,消除了数据冗余,更新异常,插入异常和删除异常。
所有单关键字的数据库表第二范式,因为有可能是一个组合关键字。
第三范式(3NF):在第二范式的表中的数据的基础上,如果没有非键字段的任何候选人相关传递函数符合第三范式的重点领域。所谓的传递函数依赖,指的决定“A→→”关系存在,则传递函数依赖于A.,所以,第三范式的数据库表中应该不存在依赖关系如下:非键字段,重点领域→X→Y
非键字段假定学生关系表锡(学号,姓名,年龄,其中[]学院[],读大学学院电话),关键字为单一关键字“研究“,因为存在之间的关系如下决定:
(学号)→(姓名,年龄,其中[]学院这个数据库是一致的[]学院[]的位置,[]学院[]电话)
2NF,但不符合3NF,因为一项决定存在以下关系:
(学生证)→(其中[]学院[])→([]学院[]位置[]学院[]电话)
非键字段“[]学院[]位置”,“[]学院[]电话”依赖“研究”的重点领域传递函数。
它也存在数据冗余,更新异常,插入异常和删除异常读者自己分析表明。
学生关系表分为以下两个表:
学生们:(学号,姓名,年龄,其中[]学院[]);
[]学院[]:([学院[],位置,电话)。
这个数据库表是符合第三范式的,消除了数据冗余,更新异常,插入异常和删除异常。
·博伊斯 - 科范式(BCNF):第三范式的基础上,数据库表中不存在任何领域的任何相关的传递函数的一个候选关键领域,到满足BCNF的
The>的假设仓库管理关系表Ssanag(仓库,存储物品,管理员,数量),管理员只在一个仓库工作,仓库可以存放各种物品。数据库中的表存在以下关系:一项决定
(仓库,存储物品)→(管理员)
(管理员,存储项目)→(仓库,数量)
所以, (仓库,储存项目)和(管理员,存储资料)Ssanag候选键,唯一的非键字段的表的数量,它是在第三范式。然而,由于存在之间的关系如下决定:
(仓库)→(管理员)
(管理员)→(仓库)
存在的关键领域确定重点领域,其不符合BCNF范式。它会出现以下异常:1)删除异常:当仓库是空的,所有储存的项目“和”数量“信息被删除的同时,”仓库“和”管理员“也被删除。2)插入一个例外:管理员可以分配到仓库,当仓库没有存储任何物品。3)更新异常:如果该存储库的管理员,管理员必须表中的所有行。
仓库管理关系表分解为两个关系表:
仓库管理:Ssanag(仓库管理员);
仓库:SS(仓库,储存项目,数量)。
这是在数据库表BCNF范式的,消除删除异常,插入异常和更新异常。
在短的五个最大的数据库范式:
第一范式:对于表中的每一行,必须和唯一的价值线唯一的值吗?成一排,每列和原子操作。
(第一范式是重复的组,每个单独的表,这些表的联系,通过这种方式来消除重复组的一个to-many关联)</第二范式:第二范式要求非主键列是主键的一个子集,非主键列活动必须完全依赖于整个主键,主键必须有一个独特的电阻元件,主键所组成的一个或多个唯一值。一旦创建后,不能更改主键,外键与主键的表。与手段 - 许多关系的主外键(Delete(删除)第二范式处理问题。冗余数据表中的信息时,通常违反了第二范式取决于以外的主键的一部分)
第三范式:第三范式要求非主键的表中的列列是相互依存的。(第三范式规则查找以消除第一范式和第二范式的表中不直接依赖于主键的属性,我们没有相关的所有信息的表的主键建??立一个新的每个新表的表从源表中保存的信息,它们依赖于主键)
第四范式:第四范式禁止主键列和非主键列一对多关系不受约束的 BR />第五范式:第五范式的表被划分成尽可能小的块,以排除多余的表格。
G. 高中数学公式
nmmnmSqSS.
46、等差数列的一个性质:设nS是数列na的前n项和,na为等差数列的充要条件是
bnanSn2 (a, b为常数)其公差是2a.
47、你知道怎样的数列求和时要用“错位相减”法吗?(若nnnbac,其中na是等差数列,nb是等
比数列,求nc的前n项的和)
48、用1nnnSSa求数列的通项公式时,你注意到11Sa了吗? 49、你还记得裂项求和吗?(如
1
1
1)1(1nnnn .)
四、排列组合、二项式定理
50、解排列组合问题的依据是:分类相加,分步相乘,有序排列,无序组合.
51、解排列组合问题的规律是:相邻问题捆绑法;不邻问题插空法;多排问题单排法;定位问题优先法;
多元问题分类法;有序分配问题法;选取问题先排后排法;至多至少问题间接法,还记得什么时候用隔板法?
52、排列数公式是: 组合数公式是: 排列数与组合数的关系是:m
n
mnCmP! 组合数性质:m
nC
=
mnn
C
mnC
+
1
mn
C
=m
nC
1
n
rrn
C
0
=n
2
1
121rnrnrrrrrrCCCCC
二项式定理: 222110)( 二项展开式的通项公式:r
rnrnrbaCT1)210(nr,,,
五、立体几何
53、有关平行垂直的证明主要利用线面关系的转化:线//线线//面面//面,线⊥线线⊥面
面⊥面,垂直常用向量来证。
54、作出二面角的平面角主要方法是什么?(定义法、三垂线法)三垂线法:一定平面,二作垂线,三
作斜线,射影可见.
55、二面角的求法主要有:解直角三角形、余弦定理、射影面积法、法向量 56、求点到面的距离的常规方法是什么?(直接法、等体积变换法、法向量法) 57、你记住三垂线定理及其逆定理了吗?
58、有关球面上两点的球面距离的求法主要是找球心角,常常与经度及纬度联系在一起,你还记得经度
及纬度的含义吗?(经度是面面角;纬度是线面角)
59、你还记得简单多面体的欧拉公式吗?(V+F-E=2,其中V为顶点数,E是棱数,F为面数),棱的两种
算法,你还记得吗?(①多面体每面为n边形,则E=
2nF;②多面体每个顶点出发有m条棱,则E=2
mV
) 六、解析几何
60、设直线方程时,一般可设直线的斜率为k,你是否注意到直线垂直于x轴时,斜率k不存在的情况?
(例如:一条直线经过点
23,3,且被圆2522yx截得的弦长为8,求此弦所在直线的方程。该题就要注意,不要漏掉x+3=0这一解.)
61、定比分点的坐标公式是什么?(起点,中点,分点以及值可要搞清)
线段的定比分点坐标公式
设P(x,y) ,P1(x1,y1) ,P2(x2,y2) ,且
21PPPP ,则
112121yyyxxx 中点坐标公式
22
21
21yyyxxx
62、若),(),(),(332211yxCyxByxA,,,则△ABC的重心G的坐标是
33321321yyyxxx,在利
用定比分点解题时,你注意到1了吗?
63、在解析几何中,研究两条直线的位置关系时,有可能这两条直线重合,而在立体几何中一般提到的
两条直线可以理解为它们不重合.
64、直线方程的几种形式:点斜式、斜截式、两点式、截矩式、一般式.以及各种形式的局限性.(如点
斜式不适用于斜率不存在的直线)
65、对不重合的两条直线0:1111CyBxAl,0:2222CyBxAl,有:
122
11
22121//CACABABAll; 0212121BBAAll. 66、直线在坐标轴上的截矩可正,可负,也可为0. 67、直线在两坐标轴上的截距相等,直线方程可以理解为
1b
y
ax,但不要忘记当 a=0时,直线y=kx在两条坐标轴上的截距都是0,也是截距相等.
68、两直线01CByAx和02CByAx的距离公式d=——————————
69、直线的方向向量还记得吗?直线的方向向量与直线的斜率有何关系?当直线L的方向向量为m=(x0,y0)时,直线斜率k=———————;当直线斜率为k时,直线的方向向量m=————— 70、到角公式及夹角公式———————,何时用? 71、处理直线与圆的位置关系有两种方法:(1)点到直线的距离;(2)直线方程与圆的方程联立,判别
式. 一般来说,前者更简捷.
72、处理圆与圆的位置关系,可用两圆的圆心距与半径之间的关系.
73、在圆中,注意利用半径、半弦长、及弦心距组成的直角三角形并且要更多联想到圆的几何性质. 74、在利用圆锥曲线统一定义解题时,你是否注意到定义中的定比的分子分母的顺序?两个定义常常结
伴而用,有时对我们解题有很大的帮助,有关过焦点弦问题用第二定义可能更为方便。(焦半径公式:椭圆:|PF1|=———— ;|PF2|=———— ;双曲线:|PF1|=———— ;|PF2|=———— (其中F1为左焦点F2为右焦
点 );抛物线:|PF|=|x0|+
2
p
) 75、在用圆锥曲线与直线联立求解时,消元后得到的方程中要注意:二次项的系数是否为零?判别式
0的限制.(求交点,弦长,中点,斜率,对称,存在性问题都在0下进行).
76、椭圆中,a,b,c的关系为————;离心率e=————;准线方程为————;焦点到相应准线距离为———— 双
曲线中,a,b,c的关系为————;离心率e=————;准线方程为————;焦点到相应准线距离为———— 77、通径是抛物线的所有焦点弦中最短的弦.
78、你知道吗?解析几何中解题关键就是把题目中的几何条件代数化,特别是一些很不起眼的条件,有
时起着关键的作用:如:点在曲线上、相交、共线、以某线段为直径的圆经过某点、夹角、垂直、平行、中点、角平分线、中点弦问题等。圆和椭圆参数方程不要忘,有时在解决问题时很方便。数形结合是解决解几问题的重要思想方法,要记得画图分析哟!
79、你注意到了吗?求轨迹与求轨迹方程有区别的。求轨迹方程可别忘了寻求范围呀!
80、在解决有关线性规划应用问题时,有以下几个步骤:先找约束条件,作出可行域,明确目标函数,
其中关键就是要搞清目标函数的几何意义,找可行域时要注意把直线方程中的y的系数变为正值。如:求2<5a-2b<4,-3<3a+b<3求a+b的取值范围,但也可以不用线性规划。 七、向量
81、两向量平行或共线的条件,它们两种形式表示,你还记得吗?注意ba是向量平行的充分不必要
条件。(定义及坐标表示) 82、向量可以解决有关夹角、距离、平行和垂直等问题,要记住以下公式:|a|2
=a·a,
cosθ=
2
22221212
121|
|||yxyxyyxxbaba
83、利用向量平行或垂直来解决解析几何中的平行和垂直问题可以不用讨论斜率不存在的情况,要注意
0ba是向量ba和向量夹角为钝角的必要而非充分条件。
84、向量的运算要和实数运算有区别:如两边不能约去一个向量,向量的乘法不满足结合律,即
cbacba)()(,切记两向量不能相除。
85、你还记得向量基本定理的几何意义吗?它的实质就是平面内的任何向量都可以用平面内任意不共线
的两个向量线性表示,它的系数的含义与求法你清楚吗?
86、一个封闭图形首尾连接而成的向量和为零向量,这是题目中的天然条件,要注意运用,对于一个向
量等式,可以移项,两边平方、两边同乘以一个实数,两边同时取模,两边同乘以 一个向量,但不能两边同除以一个向量。 87、 向量的直角坐标运算
设321321,,,,,bbbbaaaa
,则332211,,babababa
332211,,babababa
Raaaa
321,,
332211babababa
2
3
2221aaaaaa
23
222123
22
2
1
332211,cosb
bba
aababababa
Rbabababa
,,,//332211, 0332211
babababa
设A=111,,zyx, B=222,,zyx,
则
OAOBAB222,,zyx- 111,,zyx=121212,,zzyyxx 212212212zzyyxxABABAB
八、导数
88、导数的几何意义即曲线在该点处的切线的斜率,学会定义的多种变形。 89、几个重要函数的导数:①0'
C,(C为常数)②Qnnxxnn
1
'
导数的四运算法则'''
90、利用导数可以证明或判断函数的单调性,注意当f ’(x)≥0或f ’(x)≤0,带上等号。
91、f(x0)=0是函数f(x)在x0处取得极值的非充分非必要条件,f(x)在x0处取得极值的充分要条件是
什么? 92、利用导数求最值的步骤:(1)求导数xf
'
(2)求方程xf'=0的根nxxx,,,21
(3)计算极值及端点函数值的大小
(4)根据上述值的大小,确定最大值与最小值.
93、求函数极值的方法:先找定义域,再求导,找出定义域的分界点,根据单调性求出极值。告诉函数
的极值这一条件,相当于给出了两个条件:①函数在此点导数值为零,②函数在此点的值为定值。 九、概率统计
94、有关某一事件概率的求法:把所求的事件转化为等可能事件的概率(常常采用排列组合的知识),转
化为若干个互斥事件中有一个发生的概率,利用对立事件的概率,转化为相互独立事件同时发生的概率,看作某一事件在n次实验中恰有k次发生的概率,但要注意公式的使用条件。 (1)若事件A、B为互斥事件,则P(A+B)=P(A)+P(B) (2)若事件A、B为相互独立事件,则P(A·B)=P(A)·P(B) (3)若事件A、B为对立事件,则P(A)+P(B)=1一般地,
APAp1
(4)如果在一次试验中某事件发生的概率是p,那么在n次独立重复试验中这个事恰好发生K次的概
率:
k
nk
knnppCKP1
95、抽样方法主要有:简单随机抽样(抽签法、随机样数表法)常常用于总体个数较少时,它的主要特征是从总体中逐个抽取;系统抽样,常常用于总体个数较多时,它的主要特征就是均衡成若干部分,
每一部分只取一个;分层抽样,主要特征分层按比例抽样,主要使用于总体中有明显差异。它们的共同特征是每个个体被抽到的概率相等。
96、用总体估计样本的方法就是把样本的频率作为总体的概率。 十、解题方法和技巧
97、总体应试策略:先易后难,一般先作选择题,再作填空题,最后作大题,选择题力保速度和准确度
为后面大题节约出时间,但准确度是前提,对于填空题,看上去没有思路或计算太复杂可以放弃,对于大题,尽可能不留空白,把题目中的条件转化代数都有可能得分,在考试中学会放弃,摆脱一个题目无休止的纠缠,给自己营造一个良好的心理环境,这是考试成功的重要保证。 98、解答选择题的特殊方法是什么?
(顺推法,估算法,特例法,特征分析法,直观选择法,逆推验证法、数形结合法等等) 99、 答填空题时应注意什么?(特殊化,图解,等价变形) 100、解答应用型问题时,最基本要求是什么?
101、 审题、找准题目中的关键词,设未知数、列出函数关系式、代入初始条件、注明单位、作答学会
跳步得分技巧,第一问不会,第二问也可以作,用到第一问就直接用第一问的结论即可,要学会用“由已知得”“由题意得”“由平面几何知识得”等语言来连接,一旦你想来了,可在后面写上“补证”即可。
数学高考应试技巧
数学考试时,有许多地方都要考生特别注意.在考试中掌握好各种做题技巧,可以帮助各位在最后关头鲤鱼跃龙门。 考试注意:
1.考前5分钟很重要
在考试中,要充分利用考前5分钟的时间。考卷发下后,可浏览题目。当准备工作(填写姓名、考号等)完成后,可以翻到后面的解答题,通读一遍,做到心中有数。
2.区别对待各档题目
考试题目分为易、中、难三种,它们的分值比约为3:5:2。考试中大家要根据自身状况分别对待。
⑴做容易题时,要争取一次做完,不要中间拉空。这类题要100%的拿分。 ⑵做中等题时,要静下心来,尽量保证拿分,起码有80%的完成度。 ⑶做难题时,大家通常会感觉无从下手。这时要做到: ①多读题目,仔细审题。 ②在草稿上简单感觉一下。
③不要轻易放弃。许多同学一看是难题、大题,不多做考虑,就彻底投降。解答题多为小步设问,许多小问题同学们都是可以解决的,因此,每一个题、每一个问,考生都要认真对待。
3.时间分配要合理
⑴考试时主要是在选择题上抢时间。
⑵做题时要边做边检查,充分保证每一题的正确性。不要抱着“等做完后再重新检查”的念头而在后面浪费太多的时间用于检查。
⑶在交卷前30分钟要回头再检查一下自己的进度。注意及时填机读卡。