精华内容
下载资源
问答
  • Raft协议详解()日志复制

    千次阅读 2018-06-08 12:45:42
    在这一部分,我们讲Raft几个子问题中的日志复制问题。主要内容是讲Raft为什么要进行日志复制,以及如何进行日志复制的。日志复制(log replication)是leader的主要工作之一。在前面的第一、二部分,我们讲到了日志...

    在这一部分,我们讲Raft几个子问题中的日志复制问题。主要内容是讲Raft为什么要进行日志复制,以及如何进行日志复制的。日志复制(log replication)是leader的主要工作之一。在前面的第一、二部分,我们讲到了日志(log)是Raft的一致性保证非常重要的组成部分,很大程度Raft是利用log做的数据一致性。那么我们就来说说日志。


    日志是啥

    这里写图片描述

    上图是Raft论文中的图片,我们可以之间看。每台服务器上都有自己的本地log,图中一行是一个服务器。对于一台服务器上的log,可以理解为一个list。list里面有两个元素,一个是term,一个是操作。结构大概是这样:

    {
       term1:operation1,
       term2:operation2
       ……
    }

    当然,list也有索引(log index),如图最上面的1,2,3,4……。那么日志就长这样,保存着每个任期的每个操作。一个“term1:operation1”组合,被叫做一个entry。当leader认为log里面保存的entry操作可以被执行时,那么就会执行log里面的操作了。

    假如说,每台服务器上的log内容都是一样的,那么执行log操作(也叫提交(commit))的时后,服务器里面的状态机(state machin,见Raft协议详解一)的内容也一定是一样的,因为状态机的内容就是log执行的结果。换句话说,我只要保证了每台服务器上的log内容一致,那么也就保证了数据(状态机内容)的一致了。

    那么,如何保证日志一致呢?

    日志的一致性保证

    在Raft协议中有两个主要的消息,一个是在第二节讲到的RequestVote RPC,用于选主投票时leader发出的消息。一个就是AppendEntries RPC,用于心跳和日志复制。对于心跳,只需要发送空内容的AppendEntries RPC就可以了,我们主要关注日志复制的消息,看看Raft是怎么操作的。

    1.leader接受客户端的操作请求,如“将X复制为3”。假如leader当前的任期为term1,那么leader就会向自己本地log的索引K的位置添加一个entry:“term1:X赋值为3”。之所以添加到K是因为K索引位置之前已经有了log内容了。
    2.leader向集群中其他follower并行发送AppendEntries RPC消息。注意点来了!敲黑板。关键就是这个消息里面包含哪些内容。有两部分组成。一:这个新的entry:“term1:X赋值为3”。二:K-1,以及K-1索引位置的entry。
    3.当一个follower收到一个AppendEntries RPC消息时会查看自己本地的log中的K-1位置的entry的内容。

    • 假如本地log中K-1位置的entry内容与接收到的来自leader的K-1的entry内容一致,那么就将leader发来的K位置的entry保存在自己的K位置(当然要做并发控制),并返回true,告诉leader保存成功了
    • 假如本地log中K-1位置的entry内容与接收到的来自leader的K-1的entry内容不一致,那么就返回false,告诉leader不一致。leader收到消息后,会将K减小一点,然后再次重新发AppendEntries RPC,直到follower返回true。因为到K=0的时候肯定会一样(都没有),因此早晚一定会得到true的回复。此时leader将匹配的位置和最新的位置中间的内容都发送给follower,follower会将接收到的内容覆盖到对应的位置。

    4.经过第3步的操作,此时follower和leader的日志就已经一样了。

    当leader收到了大多数的follower的true的返回,那么leader就可以回复客户端,已经成功更新了数据。

    在上面第3步的过程中,需要不断去尝试K的正确位置,因此会发送比较多的AppendEntries RPC的消息。所以是可以在此处进行优化的。

    其他

    在Raft中,一切以leader为主。因此日志不是最新的话,就不能成为leader。因此在选主的时候,会进行日志比较。假如在投票阶段,一个follower收到的选主请求中,包含的日志信息比自己的要旧,那么也会拒绝给这个请求投赞成票。如何比较新旧呢?一是看任期term,一是看最后一个entry的索引号。任期大的新,任期相同的索引大的新。

    此外,假如leader在准备commit一个得到大多数follower的true的entry时,宕机了。那么后面的leader如何保证前面的leader的entry被commit呢?实际上,一条 entry被准备commit的前提是,它已经被复制到了多台服务器上了。由于leader的选举,会选择有比较新的log的服务器,那么拥有上一个leader的entry的,那一定时集群中最新的。也就是说拥有上一个leader的entry内容的服务器才能成为leader。那么后面的leader在不知道上一个leader有没有提交的情况下,怎么操作呢?(我猜可以用一个变量保存上一次执行到哪个log index位置了,后面的接着执行。具体我没看懂论文里怎么说的)

    以上就是日志复制问题了。后面我们讲第三个:维护成员变化(membership changes)

    展开全文
  • 题目一: 使用下图所示的程序,说明LINE A的输出是什么。...对于进程,会执行value+=15,但由于两进程共享代码空间,而数据空间是独立的,所以进程对value的改变不会影响到父进程中的value。进程执行完毕,...

    题目一:
    使用下图所示的程序,说明LINE A的输出是什么。为什么?

    在这里插入图片描述
    解答:
    我自己思考的是首先定义了一个名为value的变量,初始值为5,然后进入main程序,首先创建了一个子进程,然后进入if判断,这个时候有两个进程,分别进行判断。对于子进程,会执行value+=15,但由于两个进程共享代码空间,而数据空间是独立的,所以子进程对value的改变不会影响到父进程中的value。子进程执行完毕,回到父进程,会打印出PARENT:value=5,所以LINE A为PARENT:value=5
    但我在计算机上进行执行的时候,发现代码本身有问题:
    在这里插入图片描述
    这里进行修改后(将exit进行注释掉),得到的line如下:
    在这里插入图片描述
    这里我对父进程和子进程的执行顺序有所疑问,所以在pid==0的分支(子进程分支里)增添了一个输出语句,用于查看是子进程先执行还是父进程先执行:
    在这里插入图片描述
    可以看出,似乎虽然父子进程是同级的,但还是子进程先执行,父进程后执行
    但是,当我在原本的pid=0分支(子进程分支里)再增添一个pid=fork之后,发现又出现了奇怪的事情:
    在这里插入图片描述
    原本按照子先父后的规律,应该是先创建子进程1,在子进程1中又创建子进程2,然后先执行子进程2,打印value=25,然后执行子进程1,打印value=20,最后执行父进程,打印value=5,但实际上是这样的:
    在这里插入图片描述
    所以,最终的结论是,父子进程是同级的,不管是多少级的父子进程,仍旧是同级别,而且在cpu执行的时候是并行进行的。这一点在我又加入了一个子进程的分支之后得到了验证,可以看到即便是同一个程序,两次执行,输出的顺序是不一样的:
    在这里插入图片描述

    题目二:
    下面设计的优点和缺点分别是什么?分别从操作系统层面和用户层面来阐述。
    • 同步和异步通信
    • 自动和显式缓冲
    • 复制传送和引用传送
    • 固定大小和可变大小消息

    解答:
    • 同步和异步通信:
    所谓同步通信,就是在发出一个功能调用时,在没有得到结果之前,该调用的就不返回。在系统层次,同步通信会因为等待反馈信息而一直占用内存和系统资源,这是他的缺点;但在用户层次,同步通信保证了用户之间的同时同步性,确保了用户体验,这是他的优点。
    所谓异步通信,就是在发出一个功能调用后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。在系统层次,使用异步通信的优点是可以使系统尽可能高效率的进行不同的对象进行通信;在用户层次,缺点是在发出信息后不能立刻得到结果,甚至可能因为某种错误的发生而不能得到结果,影响用户体验。
    • 自动和显式缓冲:
    自动缓冲包括有限容量和无限容量的消息系统。在有限容量下,队列的长度为有限的n;因此最多只能有n个消息主流其中,如果在发送新信息的时候队列未满,那么该消息可以放在队列中,且发送者可以继续执行而不必等待。不过,线路容量有限,如果线路满,必须阻塞发送者直到队列中的空间可用位置。对于无限容量来说,队列长度可以无限,因此不管有多少消息都可以在其中等待,从不阻塞发送者。所以对于用户层次来说,采用自动缓冲可以流畅的发送信息而不用担心被阻塞而造成的卡顿情况,这是他的优点;而在系统层次,这样做会消耗或者浪费大量的系统资源和内存空间,这是他的缺点。
    采用显示缓冲可能使用户在发送信息时被阻塞而等待一段时间,这是他的缺点。但在系统层面,这样只会使用一小部分内存空间,避免了系统资源的浪费,这是他的优点。
    • 复制传送和引用传送:
    复制发送不允许接收者改变参数的状态,所以保证了参数的不可改变性,这样对于系统来说可以保持通信传输之间的一致性,这是他的优点;但对于用户来说,不能够改变参数的状态会造成一些不便,这是他的缺点。
    而引用发送允许改变参数的状态,由此他的优点之一是它允许程序员写一个分布式版本的一个集中的应用程序。
    • 固定大小和可变大小消息:
    由进程发送的消息可以是定长的或变长的。如果只能发送定长消息,那么系统级的实现十分简单,不过这一限制让编程任务更加困难。相反的,变长消息要求更复杂的系统级实现,但是编程任务变得更简单。

    题目三:
    fibonacci序列是一组数:0,1,1,2,3,5,8,…,通常他可以表示为:
    在这里插入图片描述
    使用系统调用fork()编写一个c程序,使其在子程序中生成fibonacci序列,序列的号吗将在命令行中提供。例如,如果提供的是5,fibonacci序列中的前5个数将由子进程输出。退出程序前,父进程调用wait()调用来等待子进程结束。执行必要的错误检查以保证不会接受命令行传递来的负数号码。

    解答:
    拿到这个题,我的第一反应是“明明子进程和父进程的数据空间是独立的,如何使用子进程来实现有联系的fibonacci数列呢?”,后来想到,实际上我不需要每次输出一个fibonacci数就要产生一个新的子进程,可以只产生一个子进程,而在子进程中用循环产生即可。
    具体代码如下:

    #include <sys/types.h>
    #include <stdio.h>
    #include <unistd.h>
    int main(int argc,char* argv[])
    {
    	pid_t pid;
    	int i;
    	int f0,f1,f2;
    	f0=0;
    	f1=1;
    	if(argv[1]<0)
    		printf("requer a number");
    	pid=fork();
    	if(pid<0){
    		printf("need a nun-negative number");
    		exit(-1);
    	}else if(pid == 0){
    		printf("%d\n",atoi(argv[1]));
    		printf("0 1 ");
    		for(i=2;i<atoi(argv[1]);i++){
    			f2=f0+f1;
    			f0=f1;
    			f1=f2;
    			printf("%d ",f2);
    		}
    	}else	{
    		wait(NULL);
    		printf("end");
    	}
    	return 0;
    }
    

    结果如下:
    在这里插入图片描述

    题目四:
    请检索文献了解某一特定操作系统(如 Solaris,Windows 等)所提供的进程状态及其可能的状态转换关系,并与基本的进程状态转换图进行比较。

    解答:
    在这里插入图片描述
    在这里插入图片描述
    这是linux系统的进程状态图,可以看到与基本的进程状态转换图基本一致,其中就绪状态没有改变;创建状态没有体现;运行状态没有改变,对应于占有cpu执行状态;阻塞状态分成了暂停,深度睡眠,浅度睡眠三个状态;停止状态对应于死亡状态

    题目五:
    请详细描述上下文的切换过程,并谈谈你对上下文切换的作用理解。

    解答:
    上下文切换(有时也称做进程切换或任务切换)是指CPU从一个进程或线程切换到另一个进程或线程稍微详细描述一下,上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:
    挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处,在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。因此上下文是指某一时间点CPU寄存器和程序计数器的内容, 广义上还包括内存中进程的虚拟地址映射信息。
    上下文切换只能发生在内核态中, 上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的 CPU 时间,事实上,可能是操作系统中时间消耗最大的操作。
    Linux相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少
    个人理解是:上下文是指某一时间点cpu寄存器和程序计数器的内容。上下文切换是指cpu从一个进程或线程切换到另一个进程或者线程,可以认为是内核在cpu上对进程进行以下活动:
    1、挂起一个进程,将这个进程在cpu中的状态存储在内存中的某处
    2、在内存中检索下一个进程的上下文并将其在cpu中的寄存器中恢复
    3、跳转到程序计数器所指向的位置,以恢复该进程

    题目六:
    请简述你对进程的理解,并分析进程与程序的区别和联系。

    解答:
    想要理解进程,需要从进程的三个方面进行理解,即:映像、上下文/状态、内核数据结构(PCB)
    1、映像:进程是可执行程序的映像,包含代码(文本段)、当前活动(程序计数器的值与寄存器的内容)、进程堆栈段(临时数据)、数据段(全局变量)、堆(动态分配的内存)。
    2、上下文/状态:进程状态有五种,分别是新建、运行、等待、就绪、终止。
    3、进程控制块(PCB):每个进程在os内用进程控制块表示,其中包含进程状态(以上)、程序计数器、cpu寄存器、cpu调度信息、内存管理信息、记账信息、I/O状态信息
    进程与程序的区别:程序是被动实体,进程为活动实体(有一个程序计数器来表示下一个要执行的命令与相关资源集合),同一个程序可以产生多个进程。只有当一个可执行文件被装入内存,程序才能成为进程。

    展开全文
  • MySQL主从复制的目的是读写分离,一个数据库只负责读,一个只负责写,需要在主机和从机进行配置。MySQL常用的规范包括命名规范、设计规范、SQL...最后从MySQL基础、MySQL高级和MySQL高级三个方面对数据库进行了总结。

    一、主从复制

    1.目的和解决的问题:

    目的:读写分离,一个数据库只负责读,一个只负责写。
    解决的问题:

    • 数据分布:随意停止或开始复制,并在不同地理位置分布数据备份;
    • 负载均衡:降低单个服务器的压力;
    • 故障切换:帮助应用程序避免单点失败;
    • 升级测试:可以使用更高版本的MySQL作为从库。

    2.基本原理:

    如图
    在这里插入图片描述

    3.复制的三步骤:

    (1)master将改变记录到二进制日志,这些记录过程叫做二进制日志事件binary log events;
    (2)slave将master的binary log events拷贝到它的中继日志;
    (3)slave重做中继日志中的事件,将改变应用到自己的数据库中。
    MySQL复制是异步的且串行的。

    4.复制的基本原则:

    • 每个slave只有一个master;
    • 每个slave只能有一个唯一的服务器ID;
    • 每个master可以有多个salve。

    5.一主一从常见配置:

    • MySQL版本一致且后台服务可以运行;
    • 主从主机可以相互通信;
    • 主从配置都在[mysqld]结点下,都是小写。

    主机(Windows系统)配置my.ini:

    server_id=2 #[必须]主服务器唯一ID,不能与从机重复
    log-bin=自己本地的路径/mysqlbin(例如mysql-bin) #[必须]启用二进制日志
    log-err = 自己本地的路径/mysqlerr #[可选]启用错误日志
    

    从机(Linux Ubuntu系统)配置mysqld.cnf(/etc/mysql/mysql.conf.d/mysqld.cnf):

    bind-address=0.0.0.0 #让任何IP地址连接
    server_id=1 #[必须]主服务器唯一ID
    log-bin=自己本地的路径/mysqlbin(例如/var/log/mysql/mysql-bin.log) #[可选]启用二进制日志
    

    修改过配置文件之后,要重启MySQL服务:

    service mysql restart
    

    关闭Linux防火墙:

    service iptables stop
    

    关闭Windows防火墙:
    关闭专用网络防火墙。
    在Windows主机上建立账户并授权slave:

    create user 'slave'@'从机数据库IP' identified with mysql_native_password by 'password';
    #例如create user 'zhangsan'@'192.168.1.1' identified with mysql_native_password by '123456';
    

    授权并查看状态:

    grant replication slave on *.* to 'slave'@'从机数据库IP' identified by 'password';
    #例如grant replication slave on *.* to 'zhangsan'@'192.168.1.1' identified by '123456';
    
    show master status;
    

    记录下File和position的值。

    6.配置Linux从机

    change master to master_host = '192.168.0.161',
    master_user = 'jerry',
    master_password = '123456',
    master_log_file = 'binlog.000004',
    master_log_pos= 908;
    

    7.测试是否配置成功

    start slave;  #启动从服务器复制功能
    
    show slave status;
    

    下面两个参数都是yes,则说明主从配置成功:
    slave_io_running:yes
    slave_sql_running:yes

    主从复制总结:
    当读数据和写数据都是对同一个数据库进行操作时,可能会遇到性能瓶颈,所以新增一个与原数据库相同的数据库作为从数据库,即备份,实现读写分离(主数据库写,从数据库读),既能提高读写效率,又能提高安全性,但是会产生一定延迟。

    二、MySQL操作规范

    1.命名规范

    • 表名建议使用有业务意义的英文词汇,必要时可加数字和下划线,并以英文字母开头。
    • 库、表、字段全部采用小写:
      MySQL在Linux下默认是区分大小写的,而在Windows下不区分大小写。因此,防止出现问题,建议都设置为小写。
    • 避免用 MySQL 的保留字。
    • 命名(包括表名、列名)禁止超过 30 个字符。
    • 临时库、表名必须以tmp为前缀,并以日期为后缀,如:tmp_shop_info_20200120。
    • 备份库、表必须以bak为前缀,并以日期为后缀,如:bak_shop_info_20200120。
    • 索引命名:
      非唯一索引必须按照"idx_字段名称"或"idx_表名_字段名称"进行命名;
      唯一索引必须按照"uniq_字段名称"或"uniq_表名_字段名称"进行命名。

    2.设计规范

    • 主键:
      表必须有主键;
      不使用更新频繁的列做主键;
      尽量不选择字符串列做主键;
      不使用 UUID(不重复的字符串)、MD5 HASH 做主键;
      默认使用非空的唯一键。
    • 如无特殊要求,建议都使用 InnoDB 引擎。
    • 默认使用 utf8mb4 字符集,数据排序规则使用 utf8mb4_general_ci:
      utf8mb4 为万国码,无乱码风险;与 utf8 编码相比,utf8mb4 能支持 Emoji 表情。
    • 所有表、字段都需要增加 comment 来描述此表、字段所表示的含义:
      data_status TINYINT NOT NULL DEFAULT '1' COMMENT '1代表记录有效,0代表记录无效'
    • 尽可能不使用 TEXT、BLOB 类型:
      原因:会浪费更多的磁盘和内存空间,非必要的大量大字段查询会淘汰掉热数据,导致内存命中率急剧降低,影响数据库性能。如果实在有某个字段过长需要使用TEXT、BLOB类型,则建议独立出来一张表,用主键来对应,避免影响原表的查询效率。字段用多大就取多大,避免资源浪费和性能下降。
    • 单表列数目建议小于30。

    3.SQL语句规范

    • 避免隐式转换:
      varchar要加引号。
    • 尽量不使用select *,只select需要的字段:
      读取不需要的列会增加CPU、IO、NET消耗,并且不能有效的利用覆盖索引。使用SELECT *容易在增加或者删除字段后导致程序报错。
    • 建议将子查询转换为关联查询。
    • 建议应用程序捕获SQL异常,并有相应处理:
      可以避免数据库攻击。

    4.行为规范

    • 批量导入、导出数据必须提前通知DBA协助观察;
    • 不在业务高峰期批量更新、查询数据库;
    • 删除表或者库要求尽量先重命名rename、备份,观察几天,确定对业务没影响,再drop

    三、数据库基础总结

    1.数据类型

    • 整数:tinyint、smallint、mediumint、int、bigint;
    • 实数:float、double;
    • 字符串:varchar、char、text、blob;
    • 日期时间:timestamp、datetime。

    2.列属性

    • 自增auto_increment;
    • 默认值default;
    • 非空not null;
    • 零填充zerofill;
    • 无符号unsigned。

    3.数据库操作

    连接数据库:

    mysql -uroot -p #更安全
    或者
    mysql -u root -proot
    

    退出数据库:

    exit
    --或者quit
    

    查看所有数据库:

    show databases;
    

    创建数据库:

    #创建数据库
    create database 数据库名字 charset = utf8;
    #查看创建数据库的命令
    show create database 数据库名字;
    #使用数据库
    use mydatabase;
    

    4.数据库表操作

    查看当前数据库中所有表:

    show tables;
    

    创建表:

    create table 数据表名字(字段 类型 约束[,字段 类型 约束]);
    

    查看表:

    desc demo1;
    

    查看表的创建语句:

    show create table salary;
    

    5.DML数据库管理语言

    新增:

    #全列插入:
    insert [into] 表名 values(...);
    #部分插入:
    insert into 表名(1 ,...) values(1 ,...);
    

    修改:

    update 表名 SET 字段1=新值,字段2=新值[where 条件];
    update 表名 SET 字段1=新值,字段2=新值;
    

    删除:

    delete from 表名 [where条件];
    delete from 表名; #清空表中的数据
    

    查询:
    where子句:=、>、<
    逻辑运算符:and、or、not
    模糊查询:%、_
    范围查询:in、between…and…
    空判断:is null、is not null
    聚合函数:count、max、min、sum、avg
    分组:group by
    排序:asc、desc
    分页:limit

    四、MySQL-视图、索引、事务、引擎总结

    1.视图

    (1)作用:
    视图是虚拟的表,只包含动态检索数据的查询,不包含数据;
    简化操作,隐藏细节,保护数据;
    对视图的更新会作用于基表,一般不更新。

    (2)视图操作
    定义视图:

    create view 视图名称 as select语句;
    

    查看视图:

    show tables;
    

    使用视图:

    select * from v_stu_score;
    

    删除视图:

    drop view 视图名称;
    

    2.索引

    (1)索引类型:
    唯一索引:具有唯一性约束,不允许为空;
    主键索引:特殊的唯一索引,不允许有空值;
    单值索引:单列;
    复合索引:将多个列组合在一起创建索引,可以覆盖多个列。
    (2)索引操作:
    创建索引:

    create [unique] index 索引名称 on 表名(字段名称(长度));
    

    查看索引:

    show index from 表名;
    

    删除索引:

    drop index 索引名称 on 表名;
    

    (3)索引对性能的影响:

    • 大大减少服务器需要扫描的数据量;
    • 帮助服务器避免排序和临时表;
    • 将随机I/O变顺序I/O;
    • 大大提高查询速度,降低写的速度,占用磁盘。

    (4)索引的使用场景:

    • 对于非常小的表,大部分情况下全表扫描效率更高;
    • 中到大型表,索引非常有效;
    • 特大型的表,建立和使用索引的代价将随之增长,可以使用分区技术来解决。

    (5)唯一索引与主键索引的区别:

    • 一个表只能有一个主键索引,可以有很多个唯一索引;
    • 主键索引一定是唯一索引,唯-索引不是主键索引;
    • 主键可以与外键构成参照完整性约束,防止数据不一致。

    (6)不建立索引的情况:

    • 频繁更新的字段不适合建立素引;
    • where条件里面用不到的字段不创建索引;
    • 表记录太少,当表中数据量超过三百万条数据,可以考虑建立素引;
    • 数据重复且平均的表字段,比如性别、国籍。

    3.事务

    (1)ACID特性:

    • A原子性
    • C一致性
    • I隔离性
    • D持久性

    (2)事务操作
    开启事务:

    begin;
    start transaction;
    

    提交事务:

    commit;
    

    回滚事务:

    rollback;
    

    4.存储引擎

    (1)InnoDB:
    支持事务,支持行级锁,支持外键。
    (2)MyISAM:
    不支持事务和表级锁,不支持外键。
    (3)CSV:
    以文本形式存储,不支持索引和自增。
    (4)Memory:
    存储在内存中,服务重启后数据丢失。
    (5)选择:
    根据事务、崩溃恢复、备份三个特性选择。

    五、MySQL优化总结

    1.分析慢SQL方法

    (1)记录慢查询日志

    • 开启慢查询日志set global slow_ query_ log = 1;
    • 设置阙值,默认是10秒set global long_ query_ time = 3;
    • 查看多少条慢SQLshow global status like "%slow_queries%';

    (2)使用explain
    用法:explain + sql
    (3)使用show profile

    • set profiling = 1;
    • show profiles;
    • show profile cpu,block io for query 临时表ID;

    2.SQL语句优化

    • 选择正确的存储引擎;
    • 优化字段的数据类型;
    • 为搜索字段添加索引;
    • 避免使用select *,从数据库里读出越多的数据,查询就会变得越慢;
    • 尽可能使用NOT NULL

    3.SQL注释

    符号 举例
    # SELECT * FROM USER WHERE NAME = ‘1aa1’ #and age = 22
    –空格 SELECT * FROM USER WHERE NAME = ‘1aa1’ – and age = 22
    /**/ SELECT * FROM USER WHERE NAME = ‘1aa1’ /and age = 22/

    4.分区

    (1)原理
    分区的主要目的是将数据按照一个较粗的粒度分在不同的表中, 这样可以将相关的数据存放在一起,而且如果想一次性删除整个分区的数据也很方便。
    对用户而言,分区表是-一个独立的逻辑表,但是底层MySQL将其分成多个物理子表,这对用户来说是透明的,每一个 分区表都会使用一个独立的表文件。
    (2)方式

    • RANGE分区
    • LIST分区
    • HASH分区

    (3)适用场景

    • 表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据;
    • 分区表的数据更容易维护,可以对独立的分区进行独立的操作;
    • 分区表的数据可以分布在不同的机器上,从而高效使用资源;
    • 可以使用分区表来避免某些特殊的瓶颈;
    • 可以备份和恢复独立的分区。

    5.主从复制

    (1)原理

    • 在主库上把数据更改记录到二进制日志;
    • 从库将主库的日志复制到自己的中继日志;
    • 从库读取中继日志中的事件,将其重放到从库数据中。

    (2)解决的问题

    • 数据分布;
    • 负载均衡;
    • 故障切换;
    • 升级测试。

    6*.SQL查询的安全方案

    • 使用预处理语句防止SQL注入;
    • 写入数据库的数据要进行特殊字符的转义;
    • 查询错误信息不要返回给用户,将错误记录到日志。
    展开全文
  • 数据库复习笔记(全覆盖,包括往年部分真题)

    万次阅读 多人点赞 2020-11-26 18:08:35
    ER图 ER图分为实体、属性、关系三个核心部分。实体是长方形是实体,属性是椭圆形,关系为菱形。 ## 3、数据库系统结构 **3.1数据库模式和实例的概念以及区别** *模式(Schema)* 是对数据库逻辑结构和特征的描述 是...

    PS:大学开始写博客,写了三年了,虽然大二太忙了,专业知识学的潦草,也没写太多博客。大三开始写专业课的复习笔记,没想到这一篇博文浏览和点赞这么高,心里还是挺高兴的。当时写的时候也没注意,加上好久没写了,结果用了富文本,本来一直用的Markdown,写到一半才发现,所以这一篇的排本就很丑,如果大家看着不舒服可以留言,我可以修改一下格式,当然,好好学习,学习的知识才是最重要的!

    ## 1、数据库系统概述


    **1.1 数据库的基本概念**
        数据库:
            长期储存在计算机内、有组织的、可共享的大量数据的集合。
            *基本特征:*
            数据按一定的数据模型组织、描述和储存
            可为各种用户共享、冗余度较小、易扩展
            数据独立性较高
        数据    :
            描述事物的符号记录
            数据有结构的:记录是计算机存储数据的一种格式或一种方法
        数据库管理系统及其功能:
            位于用户应用与操作系统之间的一层数据管理软件 ,是基础软件,是一个大型复杂的软件系统
            用途: 科学地组织和存储数据、高效地获取和维护数据
        数据库系统    
            是指在计算机系统中引入数据库后的系统构成。
            在不引起混淆的情况下常常把数据库系统简称为数据库。
        元数据
            用来描述数据的数据。
    **1.2 数据管理技术的产生和发展,以及每个阶段的特点**


     


    ## 2、数据模型

    **2.1数据模型的基本概念**
        是对现实世界数据特征的模拟和抽象,用来描述数据是如何组织、存储和操作的。
        
    **2.2数据模型的分类及每类常用的数据模型**
        对应不同的应用层次分成三种类型:分别是概念模型,逻辑模型和物理模型;
        概念模型:
            信息世界的基本概念:
                实体(Entity)
                    客观存在并可相互区别的事物称为实体。
                    可以是具体的人、事、物或抽象的概念。
                属性(Attribute)
                    实体所具有的某一特性称为属性。一个实体可以由若干个属性来刻画。
                码(Key)
                    唯一标识实体的属性集称为码。
                实体型(Entity Type)
                    用实体名及其属性名集合来抽象和刻画同类实体称为实体型    
                实体集(Entity Set)
                    同一类型实体的集合称为实体集
                联系(Relationship)
                    1.实体内部的联系:组成实体的各属性之间的联系
                    2.实体之间的联系: 通常是指不同实体集之间的联系
                    实体之间的联系有一对一(1:1)、一对多(1:n)和多对多(m:n)等多种类型

    **2.3数据模型的组成要素**
        数据模型是严格定义的一组概念的集合, 精确地描述了系统的静态特性、动态特性和完整性约束条件。
        数据模型由三部分组成:
            数据结构--描述系统的静态特性    数据结构的类型来命名数据模型
            数据操作--描述系统的动态特性    对数据库中各种对象的实例允许执行的操作的集合
            完整性约束
                一组完整性规则的集合
                完整性规则:
                    给定的数据模型中数据及其联系所具有的制约和依存规则。
                    用以限定符合数据模型的数据库状态以及状态的变化,以保证数据的正确、有效和相容。
                数据模型对完整性约束条件的定义
                    反映和规定必须遵守的基本的通用的完整性约束条件。
                    提供定义完整性约束条件的机制,以反映具体应用所涉及的数据必须遵守的特定的语义约束条件。
                理解
                    完整性约束使用一些规则,规范数据的操作,来保证数据的正确、有效和相容。


    ER图

    ER图分为实体、属性、关系三个核心部分。实体是长方形是实体,属性是椭圆形,关系为菱形。


    ## 3、数据库系统结构

    **3.1数据库模式和实例的概念以及区别**
            *模式(Schema)*
                是对数据库逻辑结构和特征的描述
                是型的描述,不涉及具体值
                模式是相对稳定的
            *实例(Instance)*
                数据库某一时刻的状态——模式的一个具体值
                同一个模式可能有很多实例
                实力随数据库中数据的更新而变动
    **3.2数据库系统的三级模式结构**
            *模式(Schema)*
            模式(也称概念模式):
                数据库中全体数据的逻辑结构和特征的描述
                所有用户的公共数据视图
            一般,某个应用的数据库有一个模式
            模式是数据库系统模式结构的中心:
                与数据的物理存储细节和硬件环境无关
                与具体的应用程序、开发工具及高级程序设计语言无关
            定义模式:
                DDL定义数据的逻辑结构,以某种数据模型为基础
                数据记录由哪些数据项构成,数据项的名字、类型、取值范围等
                定义数据之间的联系
                定义与数据有关的安全性、完整性要求
            *外模式 (External Schema)*
            外模式(也称子模式或用户模式):
                数据库用户使用的局部数据的逻辑结构和特征的描述
                数据库用户的数据视窗,是与某一应用有关的数据的逻辑表示
            外模式与模式的关系:
                外模式通常是模式的自己、一个模式可以有多个外模式,反映了不同的用户的应用需求、看待数据的方式、对数据保密的要求
                对模式中某一数据,在不同的外模式种结构、类型、长度、保密级别等都可以不同
            外模式与应用的关系:
                一个外模式可以为多个应用系统所使用,一个应用程序只能使用一个外模式
            外模式的用途:
                每个用户只能看见和访问所对应的外模式中的数据,简化用户视图
                保证数据库安全性的一个有力措施
            *内模式 (Internal Schema)*
            内模式(也称为存储模式):
                是数据物理结构和存储方式的描述
                是数据再数据库内部的表示方式
                    记录的存储方式(例如,顺序存储,堆存储,Cluste按hash方法存储等)
                    索引的组织方式(B+树,Bitmap,Hash)
                    数据是否压缩存储
                    数据是否加密
                    数据存储记录结构的规定——如定长/变长,记录是否可以跨页存放等
            一个数据库只有一个内模式
            三级模式是对于数据的三个抽象级别
            数据库管理系统内部提供二级映像
            外模式/模式映像:
                对每一个外模式,有一个外模式/模式映像 定义外模式与模式之间的对应关系 映像定义通常包含在各外模式的描述中
                保证数据的逻辑独立性
                当模式改变时,数据库管理员堆外模式/模式映像做相应改变,使外模式保持不变
                应用程序是依据数据的外模式编写的,应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
            模式/内模式映像:
                定义了数据全局逻辑结构与存储结构之间的对应关系。如,说明某个逻辑记录对应何种存储结构
                数据库中模式/内模式映像是唯一的
                该映像定义通常包含在模式描述中
                保证数据的物理独立性
                        当数据库的存储结构改变了(例如选用了另一种存储结构) ,数据库管理员修改模式/内模式映像,使模式保持不变
                        模式不变,则应用程序不变。保证了数据与程序的物理独立性,简称数据的物理独立性

    **3.3数据库系统的两级映像功能与数据独立性**
            保证了应用程序的稳定性
                除非应用需求本身发生变化,否则应用程序一般不需要修改
            从程序为中心——发展为以数据为中心
                具有了数据与程序之间的独立性,使得数据的定义和描述可以从应用程序中分离出去
            数据的存取由数据库管理系统管理
                简化了应用程序的编制
                大大减少了应用程序的维护和修改
    **3.4SQL SERVER数据库种类及文件(参考教材8.6节)**

    个别题目:

    ## 4、关系数据库基础

    **4.1关系模型的基本概念**
        域
            属性取值范围
        关系模式
            1.最早由E.F.Codd在1970年提出。
            2.是从表(Table)及表的处理方式中抽象出来的,是在对传统表及其操作进行数学化严格定义的基础上,引入集合理论与逻辑学理论提出的。
            3.是数据库的三大经典模型之一,现在大多数数据库系统仍然使用关系数据模型。
            4.标准的数据库语言(SQL语言)是建立在关系模型基础之上的,数据库领域的众多理论也都是建立在关系模型基础之上的。
        关系的前两种定义:
            笛卡尔乘积的子集就是一个关系
            关系是满足特定规范的二维表
        关系与关系模式的区别:
                1.同一关系模式下,可有很多的关系
                2.关系模式是关系的结构,关系是关系模式在某一时刻的数据
                3.关系模式是稳定的:而关系是某一时刻的值,是随时间可能变化的
    码:也称作键,指的是取值具有唯一性的属性,可以唯一的确定表中的一个元组,他可以由一个属性组成,也可以由多个属性共同构成;
    候选码:某一属性组的值能唯一地标识一个元组,而其子集不能的属性组
    主码:若一个关系有多个候选码,则选定一个作为主码
    外码:必须与其所参照的主码具有相同的域,且外码的取值只能引用参照表中主码的值或者使用空值。
            
    4.2关系的类型
            基本关系
                实际存在的表,是 实际存储数据的逻辑表示
            查询表
                查询结果对应的表
            视图表
                由基本表或者其他视图表导出的表
    4.3关系的性质
            列是同质的,即每一列中的分量是同一类型的数据,来自同一个域
            关系中的元组(行)无先后顺序
            关系中的属性(列)无先后顺序
            在关系中的所有元组必须是独一无二的
            在元组中的每个值是一个原子值
    4.4什么是复合属性、多值属性
    4.5关系数据库和关系数据库模式
    *4.6什么是完整性约束,五种约束的概念*
            1、关系的完整性约束
                完整性通常包括域完整性、实体完整性、参照完整性和用户自定义完整性;其中域完整性、实体完整性和参照完整性是关系模型必须满足的完整性的约束条件
            2、域完整性约束
                        指属性的值域的完整性
            3、实体完整性规则
                    关系中的主码值不可以为空值
                    意义:关系中的元组都是通过主码来识别的,若主码为空,则会出现不可识别的个体,这是不允许的。
            4、参照完整性规则
                    如果关系R1的外码Fk与关系R2的主码Pk相对应时。那么R1的每一个元组的Fk值都等于R2的某个元组的Pk值或者为空。
                     意义:如果关系R1的某个元组t1参照R2的某个元组t2,则必须要求t2存在。
            5、用户定义的完整性规则
                    用户根据具体应用的环境来定义的完整性约束。
            *五种约束*
                域约束
                键约束
                非空约束
                实体完整性约束
                参照完整性约束
            
    4.7关系代数八种运算的符号、意义及表示方法。在这八种运算中哪些属于基本运算?
    基本运算
        选择(σ)
            设R是一个n元关系,F是一个形如riθc的公式,其中θ∈{=,≠,>,<,≤,≥},R的选择操作定义为F(R)={(r1,…,ri ,…,rn )|(r1,…,ri ,…,rn )∈R∧riθc }。
            白话: 把符合条件的拿出来
        投影(Π)
            设R是一个n元关系,R的投影操作定义为∏i1,i2,…,im(R) = {(ri1, …,rim)|(r1 ,…,ri1,…,rim,…,rn)∈R}。
            白话: 看横行, 如果有两个横行相同, 只写一个. 因此若是S关系投影操作的话, 也就是有b和a
        并(∪)
            设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的并操作定义为 R∪S = { t | t∈R∨t∈S }。
            白话: R和S关系合一起, 相同的不写
        交(∩)
            设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的交操作定义为 R  S = { t | t∈R∧t∈S }= R-(R-S)。
            白话: 相同的拿出来
        差(-)
            设R和S是n元关系,而且两者各对应属性的数据类型也相同。R和S的差定义为 R-S ={ t | t∈R∧tS}。
            白话: 因为是R-S, 找R在S关系中没有的
        笛卡尔积(X)
            设R是n元关系,S是m元关系,R和S的的笛卡尔积定义为R×S={(r1,…,rn,s1,…,sm)|(r1,…, rn )∈R∧(s1, …,sm )∈S}。
            白话: 和普通的笛卡尔乘机差不多, 自己看看, 规律很好找

    连接()


        设R是n元关系,S是m元关系,A是R的属性,B是S的属性,A和B的值域具有相同的数据类型,θ∈{=, ≠, >, <, ≤, ≥}。R和S的连接操作定义为这里写图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20201124202758225.png#pic_center)
        其中,r[A]表示元组r在属性A上的值,s[B]表示元组s在属性B上的值。我们称A和B是连接属性。
    除(/)

    4.8什么叫“并兼容”的两个关系?哪些关系代数运算要求两个关系必须是“并兼容”的?什么叫“重复消除”?
        两个关系有相同数量的属性,每对对应的属性有同样的值域;   并,交,差。

    个别习题:

    选D

    选B


    ## 5、SQL语言

    **5.1SQL语言的功能组成**
            数据查询,数据操纵,数据定义,数据控制;

    **5.2单表查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)不带元组筛选条件的单表查询
            检索所有行和列:**SELECT * FROM Student**
    (2)重命名查询结果关系列名(友好列标题)
            在原始字段之后跟上As再指定标题即可:**SELECT Sno As 学号,Sname As 姓名......**      
    (3)TOP关键字
            TOP n语法只说明显示前n条数据:**SELECT TOP 3 * FROM Student**
    (4)筛选元组:IN、BETWEEN、DISTINCT、LIKE的用法
            1.可以在BETWEEN...AND语法前使用NOT取反
                检索年龄不在19-21岁的学生信息,显示学号,姓名:**SELECT Sno,Sname FROM Student WHERE Sage NOT BETWEEN 19 AND 21**
            2.要检索的信息是一系列取值列表,可以使用IN
                从Teacher表中检索职称为教授或者副教授的信息:**SELECT * FROM Teacher WHERE Tport IN('教授','副教授')**
            3.使用DISTINCT关键字,表示检索时显示不重复信息
                显示Teacher表中有哪些职称,要求信息不重复:**SELECT DISTINCT Tprot FROM Teacher**
            4.使用LIKE关键字进行模糊查询
                查询Student表中姓刘的同学:**SELECT * FROM Student WHERE Sname LIKE '刘%'**
    (5)空值检查
            检索Master数据库中spt_values表里low字段为空的数据行:**SELECT * FROM spt_values WHERE low IS NULL**
    (6)查询结果排序
            使用ORDER BY对显示的数据进行排序,升序时ASC可以省略
            显示Course表的所有行,要求按照课程名称降序显示:**SELECT * FROM Course ORDER BY Cname DESC**
            显示Course表的所有行,要求按照课程学分降序,学分相同再按照课程号升序排列:**SELECT * FROM Course ORDER BY Ccredit DESC,Cno ESC**
    (7)返回“计算列”
            对Course表,显示课程号、课程名、学分,另外额外增加一列“学时”,学时等于学分*16:**SELECT Cno,Cname,Ccredit, Ccredit*16 AS 学时 FROM Course**
    (8)五个汇总函数的用法
            COUNT(统计Teacher表中教授的数量):**SELECT COUNT(*) FROM Teacher WHERE Tprot = '教授'**   (COUBT()函数返回匹配指定条件的行数,COUNT(*)函数返回表中的记录数)
            SUM(求和):对Course表中必修课的学分进行求和:**SELECT SUM(Ccredit) FROM Course WHERE XKLB='必修'**
            MAX
            MIN
            AVG:分别用来计算最大值,最小值,平均值,显示Teacher表中教师年龄最大,最小,平均年龄:**SELECT MAX(Tage),MIN(Tage),AVG(Tage) FROM Teacher**
    (9)分组及对分组的筛选
            对Course表,按照必修和选修进行分类,统计每种类别的课程数量:**SELECT XKLB As 类别,COUNT(Cname) AS 数量 FROM Course GROUP BY XKLB**
            对Student表按照专业和性别进行分组,显示每个专业,每种性别的学生数量,按照学生数量降序排列:**SELECT Smajar,Ssex,COUNT(Sno) FROM Student GROUP BY Smajor,Ssex,ORDER BY COUNT(Sno) DESC**

    **5.3多表连接查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)内联接
        对SC和Student表进行内连接,显示学生的学号,姓名,课程号,分数:
            语法一:**SELECT Student.Sno,Student.Sname,SC.Cno,SC.Grade FROM SC JOIN Studet ON SC.Sno=Student.Sno**
            语法二:**SELECT Student.Sno,Student.Sname,SC.Cno,SC.Grade FROM SC,Student WHERE SC.Sno=Studet,Sno**
    (2)外联接
        让Student表和SC表进行左外连接,即不管学生是否选课,该学生的信息都会显示出来:
        **SELECT Student.Sno,Student.Sname,SC.Sno,SC.Grade FROM Student LEFT OUTER JOIN SC ON Student.Sno= SC.Sno**
        让SC表和Teacher表进行完全外连接,显示教师编号,教师姓名,教师讲授的课程号:
        **SELECT Teacher.Tno,Teacher.Tname.SC.Cno FROM SC FULL OUTER JOIN Teacher ON SC.Tno=Teacher.Tno**
    (3)交叉联接
        对学生和课程两张表进行交叉连接:**SELECT * FROM Student CROSS JOIN Course**
    (4)自联接
    (5)补充:一个查询优化的例子(参考课件第7讲)


    **5.4子查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)带有IN谓词的子查询
        查询在SC表中选修了课程的学生信息:**SELECT * FROM Student WHERE Sno IN (SELECT DISTINCT Sno FROM SC)**
    (2)带有比较运算符的子查询
    (3)带有ANY或ALL谓词的子查询
        在教室表中,检索比任何一个女教师年龄都大的男教师的信息:**SELECT * FROM Teacher WHERE Tsex='男' AND Tage > ALL(SELECT Tage FROM Teacher WHERE Tsex='女')**
    (4)带有EXISTS谓词的子查询(只需掌握一层EXISTS)
        查询和王国在同一专业学习的所有学生的基本信息:**SELECT Sno,Sname,Smajar FROM Student S1 WHERE EXISTS(SELECT * FROM Student S2 WHERE S2 WHERE S1.Smajor=S2.Smajor AND S2.Sname='王国')**


    **5.5集合查询,主要掌握以下SQL语句用法,并复习实验2相关部分**
    (1)并
        将学生的学号、姓名和教师的教工号,姓名,在一个检索结果中显示出来:**SELECT Sno,Sname FROM Student UNION SELECT Tno,Tname FROM Teacher**
    (2)交
        对专业名以计算机开头的学生及年龄是21岁的学生,用交运算求两者的交集:**SELECT Sno,Sname,Sage,Smajor FROM Student WHERE Smajor LIKE '计算机%' INTERSECT SELECT Sno,Sname,Sage,Smajor FROM Student WHERE Sage=21**
    (3)差
        查询专业名以计算机开头,但不包括年龄是21岁的学生:**SELECT Sno,Sname,Sage,Smajor FROM Student WHERE Smajor LIKE '计算机%' EXCEPT SELECT Sno,Sname,Sage, Smajor FROM Student WHERE Sage=21**


    **5.6数据的增、删、改(利用SQL语言),并复习实验3相关部分**
        将学生表中的学号,姓名,性别,院系,年龄,电话,邮箱抽取出来,插入Teacher表,所有新插入的数据,职称为讲师:
            **INSERT INTO Teacher(Tno,Tname,Tsex,Tdept,Tage,Tport,Tel,EMAIL)SELECT Sno,Sname,Ssex,Sdept,Sage,'讲师',Tel,EMAIL FROM Student**
        将Course表中的编号是B002的课程,学分修改为3分:
            **UPDATE Course SET Ccredit=3 WHERE Cno='B002'**
        删除Course表中编号为B009的记录
            **DELETE FROM Course WHERE Cno='B009'**

    字符截取函数SUBSTRING
            查询姓名中第二个汉字和第三个汉字相同的学生:**Select * from Student Where SUBSTRING(Sname,2,1)=SUBSTRING(Sname,3,1)**

    **5.7DDL数据定义语言,主要掌握以下SQL语句用法,并复习实验3相关部分**
    (1)创建数据库(简易版)
        CREATE DATABASE 数据库名字
    (2)删除数据库
        DROP DATABASE 数据库名字
    (3)创建数据库表:指定数据类型、是否允许为空、标识列
    (4)修改数据库表:增加列、修改列、删除列
        Alter table 表名 add 字段名 类型 是否为空
        Alter table 表名 alter column 字段名 类型 是否为空
        Alter table 表名 drop column 字段名 类型 是否为空
    (5)删除数据库表
        DROP table 表名
    (6)完整性约束条件
    ①完整性约束条件的分类:按作用对象、按状态
    ②默认值约束
    ③对数据格式的约束
    ④对取值范围或取值集合的约束
    ⑤元组级约束
    ⑥主键约束
    ⑦唯一性约束
    ⑧外键约束
    ⑨删除约束
    (7)视图的概念(复习实验3相关部分)
    (8)视图的优点
    (9)视图的创建
        创建一个名为vwSCs的视图,将学生表中院系是计算机科学学院的学生学号、姓名、性别、专业四个字段显示出来:
            **CREATE VIEW vwScs AS SELECT Sno,Sname,Ssex,Tel,EMAIL FROM Student WHERE Sdept='计算机科学学院'**
    (10)视图的修改
        通过对视图进行数据更新,将杨华的电话修改为66666666:**UPDATE vwScs SET TEL='66666666' WHERE Sname ='杨华'**
    (11)删除视图
    (12)视图的更新
    ①视图可更新性的基本判断原则
        (1)视图中的每一列都必须和一个基本表中的一个源列对应
        (2)视图中的每一行都必须和一个基本表中的一个源行对应
    ②视图可更新性的具体判断标准
            只要修改只影响与视图相关的一个基础表,视图就可以修改,
            包含聚合函数的视图不可更新
            存在计算列或者导出列的视图不可更改
    (14)索引的概念和作用(参考教材4.7节)
    (15)索引的创建和管理(复习实验3相关部分)


    **5.8DCL数据控制语言,主要掌握以下相关概念及SQL语句用法,并复习实验4相关部分**
    (1)SQL SERVER的安全控制过程、安全控制模型
    (2)SQL SERVER的身份验证模式
    (3)SQL SERVER登录名的管理
    (4)SQL SERVER数据库用户的管理
    (5)SQL SERVER权限的管理
    (6)SQL SERVER角色的管理

    **5.9 Transact-SQL编程,主要掌握以下相关概念及T-SQL语句用法,并复习实验5相关部分**
    (1)Transact-SQL基础语法
    (2)Transact-SQL流程控制语句
    (3)Transact-SQL常用函数
    (4)存储过程概述
    (5)存储过程(包括带输入和输出参数的)的创建与管理


    **6、数据库设计(复习数据库设计案例)**


    6.1数据库设计的基本过程及每阶段的主要任务
            数据库设计通常分为6个阶段
            1、需求分析:分析用户的需求,包括数据、功能和性能需求;
                    分析方法常用SA(Structured  Analysis) 结构化分析方法,SA方法从最上层的系统组织结构入手,采用自顶向下,逐层分解的方式分析系统。
                     数据流图表达了数据和处理过程的关系,在SA方法中,处理过程的处理逻辑常常借助判定表或判定树来描述。在处理功能逐步分解的同事,系统中的数据也逐级分解,形成若干层次的数据流图。系统中的数据则借助数据字典(data dictionary,DD)来描述。数据字典是系统中各类数据描述的集合,数据字典通常包括**数据项,数据结构,数据流,数据存储,和处理过程** 5个阶段。
            2、概念结构设计:主要采用E-R模型进行设计,包括画E-R图;
            3、逻辑结构设计:通过将E-R图转换成表,实现从E-R模型到关系模型的转换;
            4、数据库物理设计:主要是为所设计的数据库选择合适的存储结构和存取路径;
                    常用的存取方法有三类:1.索引方法,目前主要是B+树索引方法。2.聚簇方法(Clustering)方法。3.是HASH方法。
            5、数据库的实施:包括编程、测试和试运行;
            6、数据库运行与维护:系统的运行与数据库的日常维护。
    6.2 掌握E-R建模和绘制E-R图的方法
    6.3 “数据库逻辑结构设计阶段”的任务
    6.4 掌握将E-R模型转换为关系模型的规则和方法
            (1)每个实体类型转换成一个关系模式。实体的属性就是关系模式的属性,实体的的码就是关系的主码。
            (2)实体之间的联系转换,根据不同的情况进行不同的处理:一个 1:1 的联系可以转换为一个独立的关系模式,也可以与任意一端的关系模式合并;一个 1:n 的联系可转换为一个独立的关系模式,也可以与 n 端实体对应的关系模式合并;一个 m:n 的联系必须转换为一个关系模式。
    6.5 掌握关系模式的非形式化设计原则和更新异常的概念
    6.6 掌握1NF、2NF、3NF的概念和规范化方法(参考教材5.1、5.2、5.3节)
            *规范化*的基本思想是消除关系模式中的数据冗余,消除数据依赖中不合适的部分,解决数据插入、删除和修改时发生的异常现象。关系数据库的规范化过程中为不同程度的规范化要求设立的不同的标准或准则称为范式。一个低一级的范式的关系模式,通过模式分解可以转换为若干个高一级的范式的关系模式的集合,这种过程叫做规范化。
            6.6.1 第一范式
                    如果关系模式R所有属性均为简单属性,即每个属性都是不可再分的,则称R为第一范式。
            6.6.2 第二范式
                    如果关系模式属于第一范式,R(U,F)中的所有非主属性都完全函数依赖于任意一个候选关键字,则称关系R属于第二范式。即不存                       在某非主属性对某候选关键字存在部分函数依赖。
            6.6.3 第三范式
                    如果关系模式R属于第二范式,R(U,F)中的所有非主属性对任何候选关键字都不存在传递函数依赖,则称R是属于第三范式。
                   

    6.7 反规范化的基本概念(参考教材5.4节)
            常用的反规范化技术有哪些?
            解:反规范化常用的方法是合并 1:1 联系的表,合并 1:n 联系的表,复制 1:n 联系 1端表中数据到 n 端,复制 m:n 联系中 m 端和 n 端数据到新产生的联系表中。

    有关ER图的例题

    例题一:


    (2)将所画的 E-R 图转换为关系模型。
    解: 读者(借阅证号 ,姓名,地址)
            图书(编号,书名,出版社,单价,作者姓名)
            借阅(借阅证号,图书编号,借阅日期)
            作者(姓名,性别,工作单位)

    例题二

    2. 设计满足下述业务需求的 E-R (注意:实体、属性和联系名称均用中文表示)

    某图书馆要实现如下的业务:新书的入库,读者信息的入库,读者对图书的借阅 和归还业务。此外,图书馆还要维护书籍的作者信息,在有需求的情况下可以查 询作者联系方式。

    (1)图书,需要存储:图书编号、索书号、书名、出版社、单价;

    (2)作者,需要存储:作者编号、姓名、性别、联系电话;(3)读者,需要存储:借阅证号、姓名、联系电话。图书编号是指图书馆中的每一本书,有一个全馆唯一的编号。假定一个作者可以撰写多本图书,但是一个图书只能属于一个作者。一个读者可以借多本图书,一本书也可以先后在不同时刻被多个读者借阅。读者借阅图书时,要记录借阅的日期时间。你的设计中暂不考虑读者的还书业务,也不考虑同一个索书号的库存问题。

    2. 将该 E-R 图转换为等价的关系模式,分别指出每个关系的主键和外键,并画出各关系间的主键、外键参照(注意:关系模式的表示规范请参照下图、不用写数据类型;关系和属性名称均用中文表示)

    作者(作者编号,姓名,性别,联系电话)

    图书(图书编号,索书号,书名,出版社,单价,作者号)

    读者(借阅证号,姓名,联系电话)

    借阅(图书编号,借阅证号,借阅日期)

    说明:借阅表也可增加一个自增字段作为主键

    例题三:

    3. 设计满足下述业务需求的 E-R 图,并写出你在确定 E-R 模型约束条件时所做的其他假设(注意:实体、属性和联系名称均用中文表示)某研究所拟开发一套系统管理其科研人员及科研项目,经分析,有如下需求:

    1) 该研究所由多个研究部门组成,每个员工属于某一个研究部门;

    2) 该研究所有若干研究项目,每个项目由且仅由一个部门负责;

    3) 每个员工可参与多个研究项目(注:可参与不由员工所属部门负责的项目),当员工参与研究项目时,需记录这个员工在所参与的每个项目上的工作时间和角色。

    4) 员工的基本信息包括:员工号、姓名、性别、生日、职称、年龄;

    5) 部门的基本信息包括:部门号、部门名、办公地址;

    6) 研究项目的基本信息包括:项目编号、项目名称、项目经费;

    7) 上面信息中的员工号,部门号和项目编号都具有唯一性。


    **7、 数据库保护**


    7.1事务的基本概念
    7.2 事务的定义
            事务是用户定义的一个数据操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单元;
    7.3 事务的特征
    7.4 并发控制
            事务是并发控制的基本单位。
    7.5 并发操作引发的问题
            并发操作带来的数据不一致性包括:丢失修改、不可重复读、读 “脏” 数据。
    7.6并发控制的基本方法(封锁协议,并发调度的可串行性,两段锁协议)
            并发控制主要技术:封锁、时间戳、乐观控制法、多版本并发控制等。
            基本封锁类型:排他锁(X 锁 / 写锁)、共享锁(S 锁 / 读锁)。

    7.7 死锁的概念、预防、诊断与解除(详见教材第7.2节)
            活锁和死锁:
                活锁:事务永远处于等待状态,可通过先来先服务的策略避免。
                死锁:事物永远不能结束
                    预防:一次封锁法、顺序封锁法;
                    诊断:超时法、等待图法;
                    解除:撤销处理死锁代价最小的事务,并释放此事务的所有的锁,使其他事务得以继续运行下去。
    7.7数据库故障类型
            事务内部故障,系统故障,介质故障,计算机病毒

    7.8数据库恢复的基本方法(详见教材第7.3节)
    7.9备份和恢复数据库(详见教材第11章)
    7.10 备份类型和备份内容(详见教材第11.2节)
            数据库备份,就是通过特定的办法,将数据库的必要文件复制到转储设备的过程。其 中,转储设备是指用于放置数据库拷贝的磁带或磁盘。数据库备份的作用就是防止数据丢失,最大限度地降低灾难性数据丢失的风险,从数据库中定期保存用户对数据库所做的修改,当数据库出现故障时,用以将数据库从错误状态下恢复到正确状态的副本。还有一个作用,就是对数据库进行转储。
    7.11 备份策略(详见教材第11.3节)
    7.12 恢复策略(详见教材第11.5节)

    **8 、数据库新技术**
    8.1 什么是大数据?(参考教材14.2)
    8.2 数据仓库与数据挖掘(参考教材14.3)
    8.3 NoSQL数据库(参考教材14.4)


     

    展开全文
  • 假定父进程malloc的指针指向0x12345678, fork 后,进程中的指针也是指向0x12345678,但是这两地址都是虚拟内存地址 (virtual memory),经过内存地址转换后所对应的 物理地址是不一样的。所以两进城中的这两...
  • 三部分:内存管理

    千次阅读 2016-06-07 11:22:39
    三部分 内存管理第8章 内存管理8.1 背景内存:是现代计算机运行中心。内存由很大一组字或字节组成,每字或字节都有他们自己的地址。CPU根据程序计数器(PC)值从内存中提取指令,这些指令可能会引起进一步对特定...
  • 1、第一层:Class文件由类装载系统(类加载器Class Loader)加载进内存,有三个过程包括加载、链接、初始化。其中链接过程有验证、准备、解析过程。 2、第二层:运行时数据区包括: 线程共享区域:方法区(落地...
  • 无意中找到一本书《编程珠玑》,刚看到第二章,感觉作者讲解方式比较独特并且很有意思,在这里记录第二章的三个问题,以下是这三个问题。 三个问题   A.给定一个包含32位整数的顺序文件,它至多包含40亿个这样的...
  • Thunderbird 邮件签名三个实现方式

    万次阅读 2012-07-06 16:44:28
    Thunderbird 邮件签名三个实现方式 Thunderbird 使用有一年多了,有着 Mozilla 软件的血统它,跨平台、简洁实用、可定制性,稳定高效是让我在使用中感觉最舒心的。不过,有一个功能初次要用时,感觉不是很方便,...
  • 在android开发中,我们离不开资源文件的使用,从drawable到string,再到layout,这些资源都为我们的开发提供了极大的便利,不过我们平时大部分时间接触的资源目录一般都是下面这三个。 /res/drawable  /res/values...
  •  由于本系统将采用光盘随书分发,故写了光盘运行菜单程序,使用户可以选择安装和快捷浏览部分文件。本来这菜单程序功能也没什么,很容易实现。谁知最后客户突然要求加菜单项来拷贝音频文件,这就麻烦了,音频...
  • 浅谈企业应用集成的三个层次

    千次阅读 2012-11-22 19:35:38
      ...早些年企业在信息化方面的一穷二白不同,最近两年我所遇到的咨询客户,都有一些共性,一是已有多年的信息化应用基础,二是对信息化的困惑已经“升级”为管理和应用问题,这些问题不再停留在
  • 芯片厂商提供的android系统的SDK中分为部分:android系统源码,kernel源码,boot源码,interface源码.project: | ——android ——kernel ——boot ——interface如果要形成完整的镜像,要分别编译个部分,之后...
  • Redis复制:主从同步

    千次阅读 2018-10-14 22:03:00
    一、概述 在高并发服务当中,如果使用单个Redis...所以可以拓展到多Redis实例,采用主从机制,一master和多slave,master和多slave包含相同的数据,master负责处理写请求,slave负责读请求。Redis主从同步...
  • 文章目录C语言两种方法判别指定字符串是否被另一字符串包含一、方案一1、代码2、结果二、方案二1、代码2、结果、参考链接 C语言两种方法判别指定字符串是否被另一字符串包含 一、方案一 1、代码 /* 程序目的: ...
  • 一、组复制性能 1. 概述 2. 测试规划 3. 消息压缩 4. 组通信线程循环 5. 写入集 6. 流控 7. 其它配置 8. 主从、半同步、组复制性能对比测试 二、组复制要求与限制 1. 组复制要求 2. 组复制限制 一、组...
  • 编写你的第一 Django 程序 第2部分本教程上接 教程 第1部分 。 我们将继续开发 Web-poll 应用,并且专注在 Django 的 自动生成的管理网站上。 哲理 为你的员工或客户生成添加、修改和删除内容的管理性网站是...
  • Oracle高级复制

    千次阅读 2013-10-08 15:23:42
    Oracle作为数据库平台,并且有的项目使用到了Oracle的数据库复制技术,其中也遇到 了一些问题,因此在这里,我对Oracle的复制技术谈一下我个人的理解,希望能够对采用 Oracle数据库的项目组有所帮助。其中在文中...
  • Abaqus 结构分析 实例

    千次阅读 2020-05-18 18:40:54
    目 录一、前沿二、结构部分的创建、与主结构的合并四、计算结果的合并五、尾声 本文仅用于个人学习,除此之外,无其他任何用途,侵删。 一、前沿   本文以一四腿方桌为例,来介绍 Abaqus 结构分析的...
  • 逻辑地址(logical address):包含在机器语言指令中用来指定一操作数或一条指令的地址。这寻址方式在80x86著名的分段结构中表现得尤为具体,它促使MS-DOS或Windows程序员把程序分成若干段。每一逻辑地址都由一...
  • C#/Java 动态生成电子发票

    千次阅读 2019-06-10 16:26:09
    电子发票是电商时代的产物,PDF发票是最常见的电子发票之一...为了动态地生成发票,我使用MS Word创建了一模板,在该模板中设计好想要呈现的大部分内容及文档样式,然后通过代码替换文本和插入新内容,最后保存为...
  • 电子现金圈存(转)

    万次阅读 2013-06-08 16:16:23
    电子现金的概念是在PBOC规范的第十三部分 >>里提出的。 可以这样理解,电子现金是PBOC里的一应用,它基于借贷记. 这应用被提出的目的就是实现我们经常听说的一功能, 小额支付功能. 基于电子现金的卡目前
  • 复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致。再结合心跳机制,当感知到主节点不可访问或宕机的情形下,辅助节点通过...
  • 如何复制加密光盘

    千次阅读 2012-10-26 10:42:10
    方法 人工光盘坏道 目前最新的加密方法,原理是该VCD带防盗圈,这圈的作用是在光头读盘到防盗圈处 时是坏道,从物理上让光驱读不过去,你会发现光盘可以显示容量,但打开目录却没有 任何文件,...
  • jQuery中DOM节点删除、复制、替换、

    千次阅读 2017-05-15 23:45:11
    1DOM节点删除之empty()的基本用法 ...要移除页面上节点是开发者常见的操作,jQuery提供了几种不同...这方法不仅移除元素(和其他后代元素),同样移除元素里的文本。因为,根据说明,元素里任何文本字符串都
  • 最近硬着头皮读完了Google的大论文,现在简单来聊一下自己关于BigTable的了解。 一、什么是BigTable Bigtable是一分布式的结构化数据存储系统,它被设计用来处理海量数据:通常是分布在数千台普通服 务器上的...
  • Redis持久化与主从复制

    千次阅读 2021-03-14 10:50:34
    Redis持久化与主从复制为什么需要持久化持久化选项RDB方式AOF方式主从复制主从复制配置主从复制的启动过程 为什么需要持久化 Redis是基于内存的NoSQL数据库,读写速度自然块,但内存是瞬时的,在redis服务关闭或重启...
  • 本文是我的“关于Java语言使用注解处理器生成代码”系列第二部分。在第一部分中(请阅读这里),我们介绍了什么是Java语言的注解,以及它们的几种常用方式。...包括如何创建注解处理器,以及如何运行它们。
  • 返回值: 若成功调用一次则返回两值,进程返回0,父进程返回进程PID;否则,出错返回-1。 fork()函数将运行着的程序分成2(几乎)完全一样的进程,每进程都启动一从代码的同一位置开始执行的线程。这两...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 250,468
精华内容 100,187
关键字:

复制子包括三个部分