配色: 字号:
第2章 关系模型
2015-06-30 | 阅:  转:  |  分享 
  
数据库原理与应用复习回顾:一、数据处理的三个阶段二、数据库系统的组成三、数据库系统结构(数据独立性)1、三级模式2、二级映射四、数据模型四、数据模型数据模型是数据的组织形式,并且可以用一种数据结构来描述。主要的数据模型有:层次数据模型、网状数据模型、关系数据模型关系数据模型是在1970年由E.F.Codd提出。关系数据模型的理论基础是集合论和数理逻辑。关系模型的特点:(1)数据以表的形式组织(2)表中存放实体本身的属性和表间的关系(3)有严格的数学基础,便于用数学理论进行讨论研究(4)以表的形式组织数据,通俗直观易懂。课后习题学校中有若干系,每个系由若干个班级和教研室,每个教研室有若干个教员,其中有的教授和副教授每个人各代若干个研究生,每个班由若干个学生,每个学生选修若干个课程,每门课程可由若干个学生选修。请用E-R图画出此学校的概念模型。某工厂生产若干产品,每种产品由不同的零件组成,有的零件可用在不同的产品上。这些零件由不同的原材料制成,不同零件所用的材料可以相同。这些零件按所属的不同产品分别放在仓库中,原材料按照类别放在若干仓库中。请用E-R图画出此工厂产品、零件、材料、仓库的概念模型。2.1关系模型的数据结构1.关系的基本名词关系:一张满足某些约束条件的二维表,如表2-1Students关系。关系模型的数据结构是关系。元组:关系中的一行称为一个元组。对应表中的一行,存放的是客观世界的一个实例,如表Students关系中的一行,存放的是一个学生的数据。属性:关系中的一列,称为一个属性。对应表中的一列。一个属性表示实体的一个特征,如表Students关系中的Sno属性表示学生实体的学号特征值。域:关系中一个属性的取值范围。例如,Ssex的取值范围是{‘M’,‘F’},代表性别为男性和女性。。关系示例:关系的等价术语之间的对应关系关系的每一个分量必须是一个不可分的数据项。3.关系的候选键与主键表中某一列(或若干列的最小组合)的值能惟一标识一个行,称该列或列组为候选键。如Students表的Sno列,就是一个候选键。因为,给定一个Sno的值,如20030101,就能确定表中惟一的一行,第4行。对于一个表,可能有多个候选键。候选键取决于应用范围,如给定某个学院,没有重复的学生姓名,则Sname是Students表的一个候选键。如果一个表有多个候选键,数据库设计者通常选择其中一个候选键作为区分行的惟一性标识符,称为主键(primarykey,PK)。如果一个表只有一个候选键,那么这个候选键就作为主键。例如,在Students表,把Sno作为该表的主键。因为主键是候选键之一,而根据候选键的定义,候选键列上的各个值都惟一,因此主键列上的各个值也都惟一。4.关系模式关系模式是关系的形式化描述。最简单的表示为:关系名(属性名1,属性名2,…,属性名n)注意:主键要用下划线表明。但有时,关系模式中并没有表明主键。例如:Students关系的关系模式为:Students(Sno,Sname,Ssex,Sbirthdate,Sdept)关系模式即是一个表的表头描述。表头也称为关系的结构、关系的型等。除表头一行以外的所有行的集合(即表内容),称为关系的值。一个关系(表),由表头和表内容两部分组成,表头是相对不变的,而表内容是经常改变的。如Students表中,当有新学生入学时,就增加若干行,当学生毕业时,就要删除若干行,所以表是动态的。5.关系数据库关系数据库是相互关联的表或者说关系的集合因为一个表存放的是某一应用领域的一个实体或实体间的联系,如Students表存放的是学生这个实体(集),Courses表存放的是课程这个实体(集),Enrollment表存放的学生实体与课程实体之间的联系,这里为选课联系。因此关系数据库中存放的是某一应用领域中的所有实体和实体之间的联系。一个关系用一个关系模式表示,所有关系模式集合构成数据库的模式,它是数据库整体逻辑结构的描述。2.2关系模型的数据完整性关系模型的数据完整性指的是完整性规则。完整性规则包括实体完整性规则、参照完整性规则和用户自定义完整性规则三大类。实体完整性和参照完整性是关系模型必须满足的两个完整性规则。1.实体完整性规则实体完整性规则是表中任意一行的主键值不能为空值。空值,用“null”表示,大小写一样。空值是尚未确定的值或不确定的值。如Enrollment表中的Grade值。空值和数值型列的0值以及字符型列的空字符串的不同,数值型列的0值与字符型列的空字符串都是确定的值。根据主键的定义,主键值必须惟一。因此,实体完整性也可定义为:主键值惟一且不能为空值。表中任意一行的主键值不能为空值。完整性的意义:一个表对应存放一个实体,表中的每一行代表实体中的一个实例。如学生表用来存放学生实体,该表中的一行代表一个学生,一个学生有惟一的一个学号。如果主键值Sno为空值,表明该学生的学号不能确定,也就是说没有惟一确定的学号,这只能说明他/她不是学生,因此就不应该存放在学生表中。实体完整性的作用:一旦定义表的主键,RDBMS将自动地对该表中的每一行的主键值进行检查,若发现主键值为空或不惟一,RDBMS会给出错误信息,这样就能确保表中的每一行是惟一的,可以区分的。2.参照完整性规则参照完整性规则是一个表的外键值可以为空值。若不为空值,则必须等于另一个表中主键的某个值。外键(ForeignKey,FK):若一个表R1中的一个列或列组对应另一个表R2的主键,那么该列或列组称为表R1的外键。外键可以由一个或多个列组成,可以有重复值。外键与主键的关系示例:外键的取值的两种情况分析:参照完整性的作用:在关系数据库系统中,一旦定义了表的外键,也即定义了外键与另一个表的主键的参照与被参照联系,RDBMS将根据外键的定义,自动检查表中的每一行,若发现外键值违反外键的规则,RDBM会给出错误信息,要求用户纠正,这样能确保表之间的参照与被参照联系的正确性。说明:实体完整性和参照完整性在关系模型中是必须实现的。遗憾的是SQLServer2000中可以定义没有主键的表,即没有实现实体完整性。另外,即使表有外键,也可以不定义为外键,没有实现参照完整性。3.用户自定义完整性规则用户自定义完整性规则是表格设计者为了保证表中某些行、列的数据满足具体应用要求而自定义的一些规则。自定义规则往往根据实际的应用背景提出来。例如:在Students表中,Ssex列的取值范围只能是’F’/’M’,因为实际情况是性别只能为男或女。关系代数是对关系型数据库操作的抽象语言,也称查询语言。这里的查询,包括数据的插入、删除、修改、查找等,即数据的操纵。关系代数只对数据操纵进行抽象表示,基于关系代数实现的关系型数据库操纵语言,如SQL,才能对数据库中的数据进行实际操作。关系代数的作用只是用来衡量其它实现了的查询语言如SQL等的查询能力。关系代数中,运算的对象是关系(表),运算的结果是一个新关系(表)。关系的运算分为两大类,即传统的集合运算和专门的关系运算。传统的集合运算:∪(并运算),-(差运算),∩(交运算),×(笛卡儿积运算)。专门的关系运算:σ(选择),π(投影),∞(连接),÷(除)。1.传统的关系运算两个表的兼容性。所谓兼容,即两个表的表头结构相同,且对应列的数据类型相同。二元运算:要求有两个表参加运算,并且两个表是兼容的。并运算(R∪S):给定两个兼容的表R和S,R和S并运算的结果是一个与R和S兼容的新表。该表由属于R的所有行加上属于S的所有行组成,但必须删去重复的行,记作R∪S。并运算举例差运算(R-S):给定两个兼容的表R和S,R和S差运算的结果是一个与R和S兼容的新表。该表由属于R而不属于S的所有行组成,记作R-S。举例(见下页)交运算(R∩S):给定两个兼容的表R和S,R和S交运算的结果是一个与R和S兼容的新表,该表由既属于R又属于S的行组成,记作R∩S。举例(见下页)差运算举例交运算举例笛卡儿积运算(R×S):简称积运算,也要求有两个表参加运算,但这两个表可以不兼容。笛卡儿积运算定义:给定两个表R和S,R和S的积运算的结果是一个新表,新表中的行由R中的每一行和S中的每一行组合而成。记作R×S。笛卡儿积运算的过程:首先取R的第一行与S的每一行组合,然后取R的第二行与S的每一行组合,依次类推,直到R中的所有行处理完毕。笛卡儿积运算(R×S)若R表有m个列,S表有n个列,则R×S是一个具有(m+n)个列的表,且R×S表中的任一行的前m列是R表的一个行,后n列是S表的一个行。如果R有i行,S有j行,则R×S有(i×j)行。可见两个表的笛卡儿积运算结果会很大。新表可能包含重复的列,因此不一定是一个关系。笛卡儿积运算举例2.专门的关系运算选择运算:从指定的R表中选择某些满足条件的行构成一个新表。记作σF(R)其中,σ是选择运算的符号;F是选择条件,写成σ的下标;R写在括号中,是被选择的表名。举例:从Students表找出所有女同学的情况бSsex=‘F’(Students)结果:在选择运算中关键是写出查询条件单个查询条件的形式:AiθAj其中,Ai是表R中的列名;Aj是常量值;θ是比较运算符,可以是:=、!=、<、≤、>和≥之一。例如:学号为20010102的条件为:Sno=‘20010102’又如:所在系为计算机系的条件为:Sdept=‘Computer’多个查询条件用∧(逻辑与,也可用and)、∨(逻辑或,or)、﹁(逻辑非,not)将几个单个查询条件组合起来构成例如:从Students表查找艺术系女同学的信息Sdept=‘Art’∧Ssex=‘F’等价于:Sdept=‘Art’andSsex=‘F’表示为:бSdept=‘Art’andSsex=‘F’(Students)结果:投影运算:从指定的表R中选择某些列构成一个新表,记作∏A(R)。其中,A是一个列名或多个列名,多个列名之间用逗号分隔,A写作∏的下标;R被投影的表名。投影结果表中的重复行要消除。例如:从Students表中选择Sno、Sname和Sdept三个列组成新表的投影运算可写成:∏Sno,Sname,Sdept(Students)∏Sno,Sname,Sdept(Students)结果:连接运算:从R与S的笛卡儿积R×S中选择满足连接条件的行。记作:=σAθB(R×S)两种特殊的连接:等值连接和自然连接等值连接:连接条件用=,即AθB->A=B例Students和Enrollment的等值连接:自然连接:若等值连接的连接条件中列名相同,且结果表中消除了重复列,则把此种等值连接称为自然连接,记作R∞S。自然连接中不必标注连接条件。例如:Students表和Enrollment表的自然连接表示为:Students∞EnrollmentStudents表和Enrollment表自然连接的结果自然连接是最常见的连接运算。除非有特别的声明,连接一般指的是自然连接。自然连接的执行:先计算笛卡儿积、再进行选择运算、最后进行投影运算,消除重复的列得到结果。自然运算与等值连接的区别:自然连接要求连接的两个表有相同的列(公共列),等值连接则不要求。自然连接结果表中去掉了重复的列,等值连接却可能包含重复的列。除法运算(R÷S)设关系R定义在属性集A上,关系S定义在属性集B上,且B是A的子集,C=A-B。则,R÷S运算得到了一个在属性集C上的关系,这个关系的行与S中每一行的组合(笛卡儿积)能在R中找到。除法运算操作步骤:(1)T1←∏c(R)(2)T2←∏c((T1×S)-R)(3)T←(T1-T2)例RSR÷S2.4关系代数综合实例本节用到学生选课数据库,包括学生Students、课程Courses、选课(Enrollment)三个表。每个表的的关系模式如下,数据样本见图2-1Students(Sno,Sname,Ssex,Sage,Sdept)Courses(Cno,Cname,PreCno,Credits)Enrollment(Sno,Cno,Grade)用关系代数表示查询。解题步骤:根据题意确定要输出的列以及这些列所在的表,由此确定被操作的表名称,可能有多个。根据题意,确定选择条件以及选择条件中用到的列在哪个表中,这里又确定一些被操作的表名称。根据1、2两步确定的表名称形成所有要操作的表名集。若表名集中只有一个表,则如果要输出的列是这个表的全部列,就只用选择运算;否则先用选择,后用投影选取要输出的(属性)列。如表名集中有两个或多个表,则一般用自然连接将它们连接起来,如果发现不存在公共列,即几个表不能进行自然连接,则要在表名集中加入一个或多个中间表,中间表中含有能进行自然连接的公共列,从而使得表名集中全部表可以进行自然连接;将选择条件作用于自然连接后产生的新表上,之后一般用投影操作选取要输出的列。实例【例2.1】查询计算机系学生的学号和姓名。根据题目确定要输出的列为:Sno,Sname,都在Students表中;根据题意,要选择的是计算机系的学生,确定选择条件是:Sdept=‘Computer’,选择条件中用到的列Sdept也在Students表中;根据1,2两步确定的所有的表名,形成表名集为{Students};因为表名集中只有一个Students表,并且因为要输出的列不是Students表的全部列,则先用选择,后用投影选取要输出的列Sno,Sname。综上,该查询的关系代数表达式为:∏Sno,Sname(σSdept=‘Computer’(Students))结果:【例2.2】查询选修了课程号为C2的学生学号、姓名、所在系。根据题目确定要输出的列为:Sno,Sname,Sdept,都在Students表中;根据题意,课程号为C2,则选择条件是Cno=‘C2’,因为Cno列在Enrollment表中,所以也用到Enrollment表;根据1,2两步确定用到的表名集为{Students,Enrollment};因为表名集中有两个表,则用自然连接将它们连接起来,这两个表存在共同的列为Sno,可以进行自然连接。将选择条件Cno=‘C2’作用于自然连接后产生的新表上,并用投影操作选取要输出的列Sno,Sname,Sdept。综上,该查询的关系代数表达式为:∏Sno,Sname,Sdept(σCno=‘C2’(Students∞Enrollment))结果:【例2.3】查询选修了课程名为Database的学生学号和姓名。根据题目确定要输出的列为:Sno,Sname,都在Students表中;根据题意,课程名为Database,则选择的条件为Cname=‘Database’,因为Cname列在Courses表中,所以也用到Courses表;根据1,2两步确定用到的表名集为{Students、Courses};因为表名集中有两个表,则要用自然连接将它们连接起来,但因为这两表不存在共同的列,不能进行自然连接。因此要加入中间表,中间表中应含有能与其它两个表进行自然连接的公共列,这个表就是Enrollment。将选择条件Cname=‘Database’作用于自然连接后产生的新表上,并用投影操作选取要输出的列Sno,Sname。综上,该查询的关系代数表达式为,结果:∏Students.Sno,Sname,(σCname=‘Database’(Students∞Enrollment∞Courses))【例2.4】查询选修了课程名为Database的学生学号、姓名、成绩。根据题目确定要输出的列为:Sno,Sname,Grade,其中Sno,Sname在Students表中,Grade列在Enrollment表中,所以用到Students表和Enrollment表;根据题意,课程名为Database,则选择的条件为Cname=‘Database’,因为Cname列在Courses表中,所以也用到Courses表;根据1,2两步确定所用到的表名集为{Students,Enrollment,Courses};因为表名集中有三个表,则要用自然连接将它们连接起来,Enrollment表中含有与Students表公共的列Sno,含有与Courses表公共的列Cno,从而这三个表可以实现自然连接。将选择条件Cname=‘Database’作用于自然连接后产生的新表上,并用投影操作选取要输出的列Sno,Sname,Grade。综上,该查询的关系代数表达式为:∏Students.Sno,Sname,Grade(σCname=‘Database’(Students∞Enrollment∞Courses))结果:【例2.5】将新入学的学生信息(‘S99205’,‘Sala’,‘F’,20,‘Art’)插入Students表中。分析:可以将这一行数据看成由一个元组构成的表,将该表与Students表进行并运算。因此,该插入操作可表示为:????Students∪{‘S99205’,‘Sala’,‘F’,20,‘Art’}【例2.6】将学生信息(‘S99205’,‘Sala’,‘F’,20,‘Art’)从Students表删除。分析:可以将这行数据看成由一个元组构成的表,将Students表与该表进行差运算。因此,该删除操作可表示为:????Students-{‘S99205’,‘Sala’,‘F’,20,‘Art’}【例2.7】求没有选修课程号为C2课程的学生学号分析:可以认为是在全部学号中去掉选修了C2课程的学生学号,就得出没有选修课程号为C2的学生学号。由于在并、交、差运算中,参加运算的关系要求是兼容的,故应当先投影、再行差运算。正确的写法是:结果见表2-18。∏Sno(Students)-∏Sno(σCno=‘C2’(Enrollemnt))特别注意,本题不能写为:∏Sno(σCno?‘C2’(Enrollemnt))。因为,选择运算为行运算,并且Enrollemnt表中包含的只是选修了课程的学生学号,对那些没选任何课程的学生学号,在Enrollemnt中找不到。根据题意,要查没有选修课程号为’C2’课程的学生学号,显然包括没选任何课程的学生学号。结果见表2-19。表2-18与表2-19结果比较:【例2.8】求既选修课程号为C1课程、又选修课程号为C2课程的学生学号。分析:可以先求出选修了C1课程的学生学号,再求出选修了C2课程的学生学号,最后使用交运算的方法求出既选修课程号为C1课程、又选修课程号为C2课程的学生学号。正确的写法是:∏Sno(σCno=‘C1’(Enrollemnt))∩∏Sno(σCno=‘C2’(Enrollemnt))特别注意,本题不能写为:∏Sno(σCno=‘C1’∧Cno=‘C2’(Enrollemnt))因为选择运算为行运算,在同一行中Cno不可能既为C1,又为C2。【例2.9】求选修了课程号为C1课程或C2课程的学生学号。分析:可以先求出选修了C1课程的学生学号,再求出选修了C2课程的学生学号,最后使用并运算的方法求出选修课程号为C1课程或C2课程的学生学号。本题也可以使用或条件来表示。∏Sno(σCno=‘C1’(Enrollemnt))∪∏Sno(σCno=‘C2’(Enrollemnt))或:∏Sno(σCno=‘C1’∨Cno=‘C2’(Enrollemnt))关系代数总结:传统的集合运算表达了关系数据库的基本操作并运算可以表达数据记录的添加和插入;差运算可以表达数据记录的删除;数据记录的修改则是通过先删除,后插入这两步完成的。因此,它是SQL语言中Insert/Delete/Update语句的理论基础。专门的关系运算:选择、投影、连接运算可以表达关系数据库中的数据查询,是SQL语言中Select语句的理论基础。数据库和表的创建SQLServer基本概念1.逻辑数据库SQLServer2000数据库是存储数据的容器,是一个存放数据的表和支持这些数据的存储、检索、安全性和完整性的逻辑成分所组成的集合。(1)完全限定名完全限定名是对象的全名,包括四个部分:服务器名、数据库名、所有者名和对象名,其格式为:server.database.owner.object在SQLServer2000上创建的每个对象都必须有一个唯一的完全限定名。(2)部分限定名在使用T-SQL编程时,使用全名往往很繁琐且没有必要,所以常省略全名中的某些部分,对象全名的四个部分中的前三个部分均可以被省略,当省略中间的部分时,圆点符“.”不可省略。在部分限定名中,未指出的部分使用以下默认值:服务器:默认为本地服务器。数据库:默认为当前数据库。所有者:默认为在数据库中与当前连接会话的登录标识相关联的数据库用户名,或者数据库所有者(dbo)。2.物理数据库下面讨论物理数据库的文件和文件组。文件SQLServer2000使用一组操作系统文件来存储数据库的各种逻辑成分,包括三类文件:(1)主数据文件主数据文件简称主文件,正如其名字所示,该文件是数据库的关键文件,包含了数据库的启动信息,并且存储数据。每个数据库必须有且仅能有一个主文件,其默认扩展名为.MDF。(2)辅助数据文件辅助数据文件简称辅(助)文件,用于存储未包括在主文件内的其他数据。辅助文件的默认扩展名为.NDF。(3)日志文件日志文件用于保存恢复数据库所需的事务日志信息。每个数据库至少有一个日志文件,也可以有多个。日志文件的扩展名为.LDF。文件组有两类文件组:(1)主文件组主文件组主数据文件和任何没有明确指派给其它文件组的其它文件。(2)用户定义文件组T-SQL语句中用于创建和修改数据库的语句分别是CREATEDATABASE语句和ALTERDATABASE。四个系统数据库在安装SQLServer2000时,将创建四个系统数据库:master、model、msdb和tempdb。(1)master包含了SQLServer诸如登录账号、系统配置、数据库位置及数据库错误信息等,用于控制用户数据库和SQLServer的运行。(2)model数据库为新创建的数据库提供模板。(3)msdb为SQLServerAgent调度信息和作业记录提供存储空间。(4)tempdb为临时表和临时存储过程提供存储空间,所有与系统连接的用户的临时表和临时存储过程都存储于该数据库中。3.表表是在日常工作和生活中经常使用的一种表示数据及其关系的形式,下表就是一个学生情况表。表结构每个数据库包含了若干个表。每个表具有一定的结构,即组成表的各列的名称及数据类型,也就是日常表格的“栏目信息”。记录每个表包含了若干行数据,它们是表的“值”,表中的一行称为一个记录(Record),因此,表是记录的有限集合。字段每个记录由若干个数据项构成,将构成记录的每个数据项称为字段(Field)。例如学生情况表中,表结构为(学号,姓名,专业名,性别,出生时间,总学分,备注),包含7个字段,由8个记录组成。关键字注意到,在学生情况表中,若不加以限制,每个记录的姓名、专业、性别、出生时间、总学分和备注这6个字段的值都有可能相同,但是学号字段的值对表中所有记录来说一定不同,即通过“学号”字段可以将表中的不同记录区分开来。特殊的存储过程,当用户表中数据改变时,该存储过程被自动执行触发器存放于服务器的预先编译好的一组T-SQL语句存储过程为列提供的缺省值默认值用于为表中的列定义完整性的规则约束为数据快速检索提供支持且可以保证数据唯一性的辅助数据结构索引由表或其他视图导出的虚拟表视图定义列或变量的数据类型,SQLServer提供了系统数据类型,并允许用户自定义数据类型数据类型由行和列构成的集合,用来存储数据表说明数据库对象?501978-08-11男计算机张强民001109已提前修完一门课521979-08-05男计算机林一帆001108提前修完《数据结构》,并获学分541980-05-01男计算机李明001107?501980-11-20男计算机李方方001106?501980-08-26男计算机韦严平001104?501979-10-06女计算机王燕001103?501981-02-01男计算机程明001102?501980-02-10男计算机王林001101备注总学分出生时间性别专业名姓名学号表2-3Jounor_Studnets表并运算含义:包含一年级学生或获奖学生的信息表2-3Jounor_Studnets表差运算含义:一年级但没有获奖的学生信息表2-3Jounor_Studnets表交运算含义:一年级并获奖的学生信息。表2-3Jounor_Studnets表Students和Enrollment的等值连接的结果1c2b1b2a1aBA21BbaA字段(Field)属性(Attribute)列(Column)记录(Record)实体(Entity)行(Row)文件(File)关系(Relation)表(Table)程序员关系模型一般用户2.关系的性质关系中每一属性都是最小的。对表而言,每一个行与列的交叉点上只能存放一个单值。关系中同一属性的所有属性值具有相同的数据类型。对表而言,表中同一列中的所有列值都必须属于同一数据类型。例如表2-1中Students表的Sname列的所有值都是字符串类型。关系中的属性名不能重复。对表而言,表中每一列都有惟一的列名,不允许有两个列有相同的列名。例如表2-1Students表不允许有两个列,列名都叫Sname。关系的属性位置从左到右出现的顺序无关紧要。对表而言,表中的列从左到右出现的顺序无关紧要。即列的次序可以任意交换。例如表2-1Students表中,可以把Sname列放在第一列,也可以是第二列等等。关系中任意两个元组不能完全相同。对表而言,表中任意两个行不能完全相同,即每一行都是惟一的,没有重复的行。关系中的元组从上到下出现的顺序无关紧要。对表而言,表中的行从上到下出现的顺序也无关紧要,即行的次序可以任意交换。满足上述条件的表才能称作关系。当我们把关系和表看作是等价的时候,即默认此表是满足上述关系的性质的。理解关系的性质:横向上看,一个关系可以看作是若干个元组的集合;纵向上看,一个关系可以看作是若干个属性的集合。集合的理论表明,集合中不允许包含重复元素的,因而可以解释关系的6条性质。图2-1学生、课程、选课表主键、外键参照关系图图2-2系表、课程表主键、外键参照关系图2.3关系模型的数据操作——关系代数职工

号 姓

名 职

称 工资 扣除 实

发 基本 工龄 职务 房租 水电 86051 陈平 讲师 105 9.5 15 6 12 115.5 .

.

. .

.

. .

.

. .

.

. .

.

. .

.

. .

.

. .

.

. .

.

.





献花(0)
+1
(本文系信息检索04...首藏)