第1章 习题答案_第1页
第1章 习题答案_第2页
第1章 习题答案_第3页
第1章 习题答案_第4页
第1章 习题答案_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章数据库设计概述习题详细答案1.数据库管理系统中常用的数学模型有哪些?数据库管理系统中常用的数学模型主要有4种,具体如下:层次模型:以树形结构组织数据,数据之间呈现上下级的层次关系,每个节点只有一个父节点(根节点除外),适用于表示具有明显层次结构的数据场景。网状模型:以图结构组织数据,节点之间可以存在多个关联关系,突破了层次模型“一个节点一个父节点”的限制,能更灵活地表示复杂数据关联。关系模型:以二维表(关系)为核心组织数据,通过表中的行(记录)和列(字段)存储数据,表与表之间通过关键字建立关联。它是目前数据库管理系统的主流模型,绝大多数主流数据库(如MySQL、Oracle等)均基于此模型。面向对象模型:结合面向对象编程思想,将数据与操作数据的方法封装为对象,支持类、继承、多态等特性,适用于处理复杂的对象化数据场景。2.您听说过的关系数据库管理系统有哪些?MySQL有哪些优点?(1)常见的关系数据库管理系统主流的关系数据库管理系统多源自欧美厂商,具体包括:美国微软公司的SQLServer、美国IBM公司的DB2和Informix、德国SAP公司的Sybase、美国甲骨文公司的Oracle,以及开源免费的MySQL。(2)MySQL的优点成本优势显著:开源、免费,无需支付高昂的商业授权费用,大幅降低个人学习和企业商用的成本。易用性强:安装流程简单,配置门槛低,即使是初学者也能快速上手搭建和使用。性能高效:针对中小规模数据场景优化良好,查询、插入、更新等操作响应速度快,能满足多数应用的性能需求。功能齐全:支持SQL标准语法,具备创建数据库、表、索引、视图、存储过程、触发器等完整的数据库功能,可覆盖从简单查询到复杂业务逻辑实现的需求。兼容性与扩展性好:支持多种操作系统(Windows、Linux、Mac等),可与Java、Python、PHP等主流编程语言无缝对接,且能通过集群、分区等技术扩展处理能力。应用广泛,生态成熟:被誉为“世界上最受欢迎的开源数据库”,微信、淘宝、新浪微博等大型平台均将部分业务迁移至MySQL,社区活跃,问题解决方案丰富。3.通过本章知识的讲解,SQL与程序设计语言有什么关系?您所知道的数据库编码规范有哪些?(1)SQL与程序设计语言的关系SQL是操作关系数据库的标准语言,定义了数据库的创建、查询、更新、删除等操作的语法规范;程序设计语言(如Java、Python、PHP等)是用于构建应用程序的语言,负责实现用户交互、业务逻辑控制等功能。两者是“协作关系”:程序设计语言无法直接操作数据库数据,需通过在代码中嵌入SQL语句,或调用数据库驱动执行SQL,实现对数据库的访问(如用户登录时,程序通过SQL查询用户表验证账号密码)。核心区别:SQL并非功能完善的程序设计语言,无法构建用户界面、实现复杂的算法逻辑;程序设计语言则不具备直接操作数据库的原生能力,需依赖SQL作为数据交互的“桥梁”。(2)常见的数据库编码规范命名规则:①以标准英文命名,杜绝拼音或拼音英文混杂,采用语义化命名(如学生表用student,而非xuesheng);②多单词组合时,可采用“单词全小写+下划线分隔”(推荐,如student_no)或驼峰标记法(如studentNo);③数据库对象加专属后缀(自定义函数_fun、存储过程_proc、视图_view、触发器_trigger、索引_index、外键_fk);④避免使用关键字(如user、table,用户表可用users替代)。注释规范:为SQL代码添加注释(单行、多行或内联注释),说明代码功能、设计思路,增强可读性和可维护性,方便他人和未来的自己理解代码。书写规范:begin...end语句块内首行缩进4个空格或1个Tab,同一语句块缩进级别一致;SQL关键字不区分大小写,但为了可读性,建议统一书写为小写(如delete、from)。大小写规范:数据库名、表名的大小写需严格统一,避免因操作系统差异(Windows大小写不敏感、Linux大小写敏感)导致移植问题。4.通过本章的学习,您觉得数据库表与电子表格(如Excel)有哪些区别?数据库表与电子表格(如Excel)在外观上均为“行列表格”,但核心逻辑和功能差异显著,具体区别如下:单元格合并:电子表格支持合并单元格(如合并表头单元格);数据库表不支持,每个单元格独立存储数据,确保数据结构的规范性。列名唯一性:电子表格的列名可重复(如同一表格中出现两个“姓名”列);数据库表的列名(字段名)必须唯一,否则无法创建表。数据类型一致性:电子表格同一列可存储不同类型数据(如一列中同时有数字、文本);数据库表同一列必须存储同一种数据类型(如学号列统一为字符串类型),以提升查询效率和数据规范性。记录唯一性:电子表格允许重复记录;数据库表不允许,需通过主键唯一标识每一条记录,确保数据不重复。索引支持:电子表格无“索引”概念,查询大量数据时效率极低;数据库表支持索引(至少有一个主键索引),可大幅提升查询速度。并发操作:电子表格不支持多用户并发写操作(多人同时编辑易导致数据冲突);数据库表支持多用户并发操作,通过事务、锁机制保障数据一致性。5.罗列“选课系统”需要实现哪些功能。依据自己所掌握的知识,描述如何使用数据库技术实现“选课系统”中的这些功能。(1)选课系统核心功能游客功能:模糊查询已审核课程;注册成为学生或教师。教师功能:登录系统;申报选修课程(填写课程名、容量等信息);查看本人申报课程的学生列表。学生功能:登录系统;从已审核课程中选课(限制最多选2门);查看个人选课信息;课程被删除后可重新选课。管理员功能:审核课程;添加班级信息(班级名不重复);批量重置师生密码;删除选修人数少于30人的课程;查看所有课程的学生列表。系统规则控制:教师仅能申报1门课程;课程容量限制为60/150/230(对应教室座位数);自动登记选课/调课时间;避免课程最后一个席位被多人抢占。(2)数据库技术实现方案数据存储:设计5张核心表(teacher、course、student、classes、choose),分别存储教师、课程、学生、班级、选课信息,通过字段对应实体属性(如course表用course_name存储课程名)。身份验证:师生登录时,程序通过SQL的select语句查询对应表(如student表),匹配学号/工号和密码,验证通过则允许登录;通过视图或存储过程避免SQL注入。功能规则控制:①教师限报1门课程:在course表的teacher_no字段添加唯一约束,确保一个工号仅对应一门课程;②学生限选2门课程:通过触发器统计学生选课数量,超过2门则拒绝插入;③课程容量限制:用触发器模拟检查约束,确保capacity字段值为60/150/230;④班级名不重复:在classes表的class_name字段添加唯一约束。数据查询与统计:①游客查询课程:用select语句结合where条件(status='已审核')实现模糊查询;②统计课程剩余名额:通过子查询统计选课人数,用课程容量减去选课人数得出结果;③查看学生列表:用join语句关联student表和choose表,筛选对应课程的学生信息。数据一致性保障:①自动登记时间:在choose表的create_time(选课时间)、update_time(调课时间)字段设置默认值为当前时间;②课程删除后学生重选:删除course表记录时,通过外键级联删除choose表中对应课程的选课记录,释放学生选课名额;③并发控制:用事务和锁机制避免课程最后一个席位被多人抢占。6.如何理解“E-R图中实体间的关系是双向的”?能不能举个例子?(1)核心理解E-R图中实体间的关系并非“单向关联”,而是“双向交互”的,即两个实体之间的关联需从“双方视角”分别描述,最终结合形成完整的关系定义。设计物理数据模型时,需要基于这种双向性选择更合理的关联方式(如让“多方”记住“一方”)。(2)举例说明以“班级”和“学生”实体为例:从“班级→学生”的视角:一个班级可以包含若干名学生(关联数目为“多”),描述的是班级对学生的“一对多”单向关系。从“学生→班级”的视角:一名学生只能属于一个班级(关联数目为“一”),描述的是学生对班级的“一对一”单向关系。双向关系整合:两个单向关系结合,最终确定“班级”与“学生”实体间的关系是“一对多(1∶m)”。这种双向性的实际意义在于,物理建模时选择“让学生表记录所属班级的class_no(外键)”,而非“让班级表记录所有学生的学号”,更符合数据存储的合理性(类似“学生记住校长易,校长记住所有学生难”)。7.在E-R图中,什么是实体?什么是属性?什么是关系?什么是基数?关系分几种?什么是关联?实体:表示现实世界中具有相同属性的“事物集合”(而非单个具体事物),是E-R图的核心要素之一,用矩形表示。例如选课系统中的“学生”“教师”“课程”“班级”均为实体,代表一类事物的统称。属性:表示实体的某种特征,或实体间关系的特征,用椭圆(Chen方法)或置于实体矩形内部(Crow'sfoot方法)表示,每个属性由属性名唯一标记。例如课程实体的“课程名”“容量”“状态”均为属性。关系:表示实体间的联系,用线段(Crow'sfoot方法)或菱形(Chen方法)表示,且关系具有双向性。例如“教师”与“课程”的“申报”关系、“学生”与“课程”的“选修”关系。基数:表示一个实体到另一个实体的关联数目(针对关系的某个方向),可表示为取值范围或具体数值。基数分为“强制关系”(最小值为1,用“|”表示,对应非空约束)和“可选关系”(最小值为0,用“O”表示,对应字段可空)。例如课程必须由教师申报(课程→教师为强制关系),教师未必申报课程(教师→课程为可选关系)。关系的种类:基于基数和双向性,分为3类:①一对一(1∶1):双方单向关系均为“一”(如教师与课程,一名教师限报1门,一门课程限1名教师申报);②一对多(1∶m):一方单向关系为“一”,另一方为“多”(如班级与学生);③多对多(m∶n):双方单向关系均为“多”(如学生与课程,一名学生可选多门,一门课程可被多名学生选)。关联:用于表示存在自身属性的多对多关系,本质是一个“关系实体”,可存储关系的额外信息(如时间、状态)。例如学生与课程的选修关系存在“成绩”“选课时间”等属性,需用“选修关联”表示,对应物理模型中的choose表。8.使用绘图工具绘制选课系统的E-R图。(1)绘图工具选择推荐使用PowerDesigner(专业建模工具,支持正向/逆向工程),也可使用Visio、在线绘图工具(如ProcessOn)或Word绘图工具。以下基于PowerDesigner的Crow'sfoot方法描述绘制要点。(2)E-R图核心要素实体及属性:①教师(teacher):工号(teacher_no)、姓名(teacher_name)、联系方式(teacher_contact);②课程(course):课号(course_no)、课程名(course_name)、容量(capacity)、课程描述(description)、状态(status);③学生(student):学号(student_no)、姓名(student_name)、联系方式(student_contact);④班级(classes):班级号(class_no)、班级名(class_name)、所属院系(department_name)。关联及属性:选修关联(choose):成绩(score)、选课时间(create_time)、调课时间(update_time)。实体间关系:①教师与课程:1∶1(教师申报课程,course表的teacher_no为外键+唯一约束);②班级与学生:1∶m(学生属于班级,student表的class_no为外键);③学生与课程:m∶n(通过选修关联连接,choose表的student_no和course_no为外键)。(3)绘制步骤打开PowerDesigner,新建“ConceptualDataModel”。创建4个实体,分别填写实体名和对应属性,设置主键(如teacher的teacher_no)。创建“选修关联”,添加对应属性。连接实体与关系/关联,设置关系类型(1∶1、1∶m、m∶n)和基数(强制/可选)。调整布局,确保图形简洁清晰,保存为PDF或图片格式。9.数据库的设计步骤是什么?为每个表定义一个主键有技巧可循吗?主键与关键字有什么关系?(1)数据库的设计步骤核心分为3个阶段,具体步骤如下:概念数据模型(CDM)设计:①需求分析:明确系统功能和问题域(如选课系统的师生操作、规则限制);②提炼实体、属性和关系;③绘制E-R图(核心产出物,决定数据库质量)。物理数据模型(PDM)设计:①选择数据库管理系统(如MySQL);②将E-R图转换为表结构(实体→表、属性→字段);③定义主键、外键;④选择字段数据类型;⑤添加约束;⑥设计索引;⑦用规范化理论评价并优化表结构。数据库实施:通过SQL脚本创建数据库、表、索引等对象,部署业务逻辑(存储过程、触发器),测试数据一致性和功能可用性。(2)定义主键的技巧技巧1:主键字段长度越短越好。优先选择短字段(如学号、工号)作为主键,避免用长文本(如班级名“2024数据科学与大数据技术1班”),减少存储开销和管理难度。技巧2:尽量避免复合主键。复合主键(多字段组合)会增加表维护难度(如更新、删除操作复杂),若无合适单字段主键,参考技巧3。技巧3:无合适字段时,添加“无意义字段”作为主键。例如班级表添加class_no、课程表添加course_no作为主键,优点:①避免复合主键,符合2NF;②减少主键数据因业务变化被修改(如课程名修改不会影响主键)。技巧4:主键值自动生成。由数据库(如MySQL的auto_increment)或应用程序自动生成主键值,避免手工录入导致的错误(如重复、空缺)。(3)主键与关键字的关系关键字(键):能唯一标识表中一条记录的字段或字段组合,核心要求是“非空(notnull)+唯一(unique)”。一个表可以有多个关键字(如学生表的学号、身份证号均可作为关键字)。主键:是从表的多个关键字中“选中的一个核心关键字”,用于作为表的主要标识。一个表有且仅有一个主键,且继承关键字“非空+唯一”的特性。核心关系:主键属于关键字的子集,所有主键都是关键字,但并非所有关键字都是主键。例如学生表中,学号是主键,身份证号是关键字但非主键。10.在数据库设计过程中,数据库表如何表示E-R图中的1∶m、1∶1、m∶n关系?表示一对多(1∶m)关系:①核心逻辑:让“多方”记住“一方”,通过外键维持关系;②具体操作:将“一方”表的主键添加到“多方”表中,作为“多方”表的外键。例如班级(一方)与学生(多方),将班级表的主键class_no添加到学生表中作为外键,学生表通过class_no关联所属班级。表示一对一(1∶1)关系:①核心逻辑:基于一对多关系的基础,额外向外键添加“唯一性约束(unique)”,限制外键值不可重复;②具体操作:选择“被动方”表添加外键(需结合业务逻辑,选择“必须关联”的一方作为被动方)。例如教师与课程(1∶1),课程必须由教师申报(课程为被动方),将教师表的主键teacher_no添加到课程表中作为外键,并添加唯一约束,确保一个教师仅对应一门课程。表示多对多(m∶n)关系:①核心逻辑:创建“中间表”(对应E-R图的关联),将两个“多方”表的主键均添加到中间表中作为外键,由中间表维持多对多关系;②具体操作:中间表的外键组合唯一标识一条关联记录,若需存储关系属性,可在中间表中添加对应字段。例如学生与课程(m∶n),创建choose中间表,添加student_no(关联学生表主键)和course_no(关联课程表主键)作为外键,同时添加score、create_time等属性字段。11.在数据库管理系统中,您所熟知的数据类型有哪些?每一种数据类型能不能各列举一些例子?数据库管理系统中常用的数据类型分为3大类,具体如下:数值类型:用于存储可参与算术运算的数值,分为整数类型和小数类型。①整数类型:MySQL中的int(如学号1001、工号2024001)、tinyint(如性别编码1=男、2=女);②小数类型:精确小数decimal(如成绩88.5、工资5000.00)、浮点数float/double(如商品价格99.99)。字符串类型:用于存储文本数据,分为定长和变长。①定长字符串char(如性别“男”“女”,长度固定);②变长字符串varchar(如姓名“张三”、课程名“Java语言程序设计”,长度随内容变化);③长文本text(如课程详细描述、学生备注信息)。日期类型:用于存储时间相关数据,本质是时间戳(可参与简单加减运算)。①日期类型date(如出生日期“2000-01-01”,格式YYYY-MM-DD);②日期时间类型datetime(如选课时间“2024-09-0108:30:00”,格式YYYY-MM-DDhh:ii:ss);③时间戳timestamp(自动记录数据插入/更新时间,如create_time)。补充说明:部分数据外观为数值,但不参与算术运算(如手机号码、身份证号),建议存储为字符串类型(如varchar(11)存储手机号)。12.您所熟知的约束条件有哪些?MySQL支持哪些约束条件?(1)常见的约束条件(SQL标准定义)主键约束(primarykeyconstraint):确保表中记录唯一,一个表有且仅有一个主键,主键字段非空且唯一。非空约束(notnullconstraint):强制字段必须输入有效值,不允许为空(null)。检查约束(checkconstraint):检查字段输入值是否符合指定条件(如成绩0-100、课程容量60/150/230)。默认值约束(defaultconstraint):插入记录时,若未指定字段值,自动填充默认值(如课程状态默认“未审核”)。唯一性约束(uniqueconstraint):确保字段或字段组合的值不重复(可空,一个表可多个)。外键约束(foreignkeyconstraint):维持两张表(父表、子表)的参照完整性,子表外键值需匹配父表主键值或为空。(2)MySQL支持的约束条件MySQL不支持SQL标准的“检查约束”,仅支持其余5种约束:主键约束、非空约束、默认值约束、唯一性约束、外键约束。对于检查约束的需求,需通过触发器模拟实现(如限制课程容量的取值范围)。13.选课系统有几个表?每个表有哪些字段?每个字段的数据类型是什么?哪些字段应该设置约束?应该设置何种约束?(1)选课系统的表结构(共5张表)以下基于MySQL环境设计,字段数据类型结合业务场景选择,约束基于功能需求设置:表1:教师表(teacher)字段及数据类型:①teacher_no(varchar(20)):工号;②teacher_name(varchar(20)):姓名;③teacher_contact(varchar(20)):联系方式。约束设置:①teacher_no:主键约束(唯一标识教师)、非空约束;②teacher_name:非空约束(教师必须有姓名);③teacher_contact:无强制约束(允许为空)。表2:班级表(classes)字段及数据类型:①class_no(varchar(20)):班级号;②class_name(varchar(50)):班级名;③department_name(varchar(50)):所属院系。约束设置:①class_no:主键约束、非空约束;②class_name:非空约束、唯一性约束(班级名不可重复);③department_name:非空约束(班级必须归属院系)。表3:学生表(student)字段及数据类型:①student_no(varchar(20)):学号;②student_name(varchar(20)):姓名;③student_contact(varchar(20)):联系方式;④class_no(varchar(20)):所属班级号(外键)。约束设置:①student_no:主键约束、非空约束;②student_name:非空约束;③class_no:外键约束(参照classes表的class_no)、非空约束(学生必须归属班级)。表4:课程表(course)字段及数据类型:①course_no(varchar(20)):课号;②course_name(varchar(50)):课程名;③capacity(int):容量;④description(text):课程描述;⑤status(varchar(20)):状态(未审核/已审核);⑥teacher_no(varchar(20)):任课教师工号(外键)。约束设置:①course_no:主键约束、非空约束;②course_name:非空约束;③capacity:非空约束、默认值约束(默认60);④status:非空约束、默认值约束(默认“未审核”);⑤teacher_no:外键约束(参照teacher表的teacher_no)、非空约束、唯一性约束(实现教师与课程1∶1关系)。表5:选课表(choose)字段及数据类型:①choose_no(int):选课记录号(主键);②student_no(varchar(20)):学号(外键);③course_no(varchar(20)):课号(外键);④score(int):成绩;⑤create_time(datetime):选课时间;⑥update_time(datetime):调课时间。约束设置:①choose_no:主键约束、非空约束、自增约束(auto_increment);②student_no:外键约束(参照student表的student_no)、非空约束;③course_no:外键约束(参照course表的course_no)、非空约束;④(student_no,course_no):唯一性约束(避免学生重复选同一门课);⑤create_time:非空约束、默认值约束(默认当前时间);⑥score:默认值约束(默认null,未考试时无成绩)。14.MySQL支持检查约束吗?如何实现MySQL的检查约束?(1)MySQL对检查约束的支持情况MySQL不支持SQL标准的“检查约束(checkconstraint)”。虽然MySQL8.0+版本在语法上允许书写check约束,但仅作为“语法兼容”,不会实际生效(即输入不符合条件的数据仍能插入)。(2)MySQL中实现检查约束的方案:触发器核心思路:创建触发器,在插入(insert)或更新(update)数据时,检查字段值是否符合条件;若不符合,触发错误并拒绝操作。以下以“限制课程容量为60/150/230”为例,演示实现步骤:创建触发器(插入数据时检查):创建触发器(更新数据时检查):效果说明:当向course表插入或更新capacity字段时,若值不是60、150、230,触发器会抛出错误,拒绝操作,从而模拟实现检查约束的功能。15.什么是1NF、2NF、3NF?什么是部分函数依赖、传递函数依赖?存在部分函数依赖、传递函数依赖的表结构会引发哪些问题?(1)1NF、2NF、3NF的定义(范式是累积的,符合高范式必符合低范式)1NF(第一范式):最基础范式,要求:①无合并单元格;②表有且仅有一个主键(无重复记录);③无重复列名。几乎所有关系数据库管理系统都强制表结构符合1NF(否则无法创建表)。2NF(第二范式):在1NF基础上,要求“每个非关键字字段完全函数依赖于主键”,即无“部分函数依赖”。3NF(第三范式):在1NF、2NF基础上,要求“无传递函数依赖”,即非关键字字段不依赖于其他非关键字字段。(2)部分函数依赖与传递函数依赖的定义部分函数依赖:若字段Y函数依赖于主键X(X→Y),但Y也可由X的某个真子集X'决定(X'→Y),则Y部分依赖于X。例如选课表主键为(student_no,course_no),学生姓名仅由student_no决定(与course_no无关),则(student_no,course_no)→student_name为部分函数依赖。传递函数依赖:若字段Z依赖于字段Y(Y→Z),字段Y依赖于主键X(X→Y),且Z不属于X或Y,则Z传递依赖于X。例如学生表主键为student_no,student_no→居住地,居住地→邮编,则student_no→邮编为传递函数依赖。(3)部分/传递函数依赖引发的问题数据冗余:重复存储相同数据(如部分依赖中,学生选多门课则姓名重复存储;传递依赖中,同一居住地学生则邮编重复存储)。更新异常:修改数据时需更新所有关联记录,漏改则导致数据不一致(如修改学生居住地后,需更新所有选课记录中的邮编,漏改则出现同一学生多个邮编)。插入异常:无法插入“无关联主键”的数据(如传递依赖中,新增居住地时,因无对应学生(主键)而无法插入邮编信息)。删除异常:删除主数据时,意外删除关联的附属数据(如删除学生所有选课记录时,同时删除了学生姓名、居住地等基础信息)。16.如果某数据库开发人员将学生表设计为如下表结构,请用数据库规范化理论解释该表是否符合3NF的要求?(student_no,student_no,student_name,student_contact,class_no,department_name)该表结构不符合3NF要求,甚至不符合1NF要求,具体分析如下:第一步:判断是否符合1NF。1NF要求“无重复列名”,该表结构中出现两个“student_no”列(重复列名),直接违反1NF。而范式是累积的,不符合1NF则必然不符合2NF和3NF。第二步:假设修正重复列名(保留一个student_no作为主键),进一步分析2NF和3NF。修正后表结构为(student_no,student_name,student_contact,class_no,department_name):①无部分函数依赖(主键为单字段,不存在“主键子集决定非关键字字段”的情况),符合2NF;②存在传递函数依赖:student_no→class_no(主键→班级号),class_no

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论