MySQL数据库应用项目教程 课件 项目7 走进 NoSQL_第1页
MySQL数据库应用项目教程 课件 项目7 走进 NoSQL_第2页
MySQL数据库应用项目教程 课件 项目7 走进 NoSQL_第3页
MySQL数据库应用项目教程 课件 项目7 走进 NoSQL_第4页
MySQL数据库应用项目教程 课件 项目7 走进 NoSQL_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

MySQL数据库应用

项目教程项目七走进NoSQL7.1初识NoSQL

7.2走进HBase

7.3走进MongoDB

7.1初识NoSQL7.1.1认识NoSQL1.NoSQL的简介NoSQL数据库成为一个热门的新领域。“NoSQL”是“NotOnlySQL”的缩写,表示适用关系型数据库的时候就使用关系型数据库,不适用的时候可以考虑使用更加合适的数据库工具。NoSQL数据库一般会弱化关系,即弱化模式或表结构、弱化完整性约束、弱化甚至取消事务机制等,其目的是去掉关系模型的约束,以实现强大的分布式部署。主要特点包括分区容错性、伸缩性和访问效率(可用性)等。云服务商也都提供了在线的NoSQL数据库及关系型数据库。例如,在亚马逊的公有云服务AWS(AmazonWebServices)中,提供了名为DynamoDB的NoSQL数据库服务,阿里云、腾讯云等知名云服务商均提供了在线的Key-Value数据库服务(NoSQL数据库的一种)。7.1初识NoSQL7.1.1认识NoSQL2.NewSQL的概念NewSQL一般被看作传统关系型数据库的延伸,是在关系型数据库的基础上通过吸收NoSQL数据库的优点而形成的。NewSQL被描绘成既支持关系模型和强事务机制,也支持分布式并行结构(具有良好的伸缩性和容错性)的数据库形式。NewSQL还可以通过SQL语句进行查询等。从NewSQL的发展现状来看,有两个特点值得注意。(1)NewSQL仍缺乏一个权威的定义,其归类也比较模糊。例如,一些文章会将某些内存数据库或者某些关系型数据库的扩展系统归类为NewSQL。(2)缺少知名度较高的NewSQL产品。7.1初识NoSQL7.1.1认识NoSQL3.NoSQL的典型应用场景(1)海量日志数据、业务数据或监控数据的管理和查询。例如,管理电商网站及其应用程序的用户访问记录、交易记录,管理工业物联网中的数据采集与监视控制系统(SupervisoryControlAndDataAcquisition,SCADA)的数据。(2)特殊的或复杂的数据模型的简化处理。例如,互联网中的网页和链接可以看作是点和线的关系,这样可以把互联网中的网站和网页的关系抽象为有向图。(3)作为数据仓库、数据挖掘系统或OLAP(On-LineAnalyticalProcessing,联机分析处理)系统的后台数据支撑。7.1初识NoSQL7.1.1认识NoSQL4.NoSQL数据库的相关技术NoSQL数据库一般基于分布式系统实现数据的管理与查询。(1)分布式数据处理。大数据的处理和计算包含数据预处理、数据统计分析和数据挖掘等方面。分布式数据处理需要解决数据分割,任务的调度、监控和管理及分布式任务的执行等问题。(2)时间同步服务。在分布式应用中,经常需要确保所有节点的时间是一致的。(3)布隆过滤器。7.1初识NoSQL7.1.2NoSQL的数据存储模式和相对应的数据库NoSQL的数据存储模式(DataStorageScheme)主要涉及在数据库中存放数据的逻辑结构,基本的数据读写、修改、删除等操作,数据处理对象及在分布式状态下的一些处理方式。1.列存储模式和列族数据库列存储模式主要用在OLAP、数据仓库等场合。列存储模式一般不预先定义结构。列存储模式则一般通过数据追加(append)的方式实现。此外,利用列存储模式还可以通过数据字典的方式实现数据压缩。例如,将某个列或某些列的值空间做成数据字典(表),在存储列值时,只需要存储数据字典中的值序号即可。列存储模式可能会通过“列族”(columnfamily)的概念来组织数据,列族是若干列的集合,各个列的数量和名称都是任意的。列族数据库有谷歌的BigTable和Dremel、斯通布雷克提出的C-Store等。7.1初识NoSQL7.1.2NoSQL的数据存储模式和相对应的数据库2.文档存储模式和文档数据库文档存储模式和键值存储模式具有一定的相似性,但其值一般为半结构化数据,需要通过某种半结构化标记语言进行描述,如JSON或XML。文档存储模式可以通过关键词查询文档内部的结构,而非只通过键来进行检索。文档存储模式通常会采用JSON或类似JSON的方式描述数据。文档数据库有MongoBD和CouchDB等,这些数据库可以在分布式集群上实现文档式数据存储和管理。文档数据库的优点和缺点。(1)优点。①简单。②相对高效。③文档格式处理。④查询功能强大。⑤分布式处理。(2)缺点。①缺少约束。②数据出现冗余。③相对低效。7.1初识NoSQL7.1.2NoSQL的数据存储模式和相对应的数据库3.键值对存储模式和键值数据库键值对存储模式也就是Key-Value模式。适合按照键对数据进行快速定位,还可以通过对键进行排序和分区,以实现更快速的数据定位。键值对存储模式的NoSQL数据库通常不会支持对值建立索引,因为值对应的列不确定键值数据库(Key-ValueDatabase)是一类轻量级且以内存处理为主的NoSQL数据库。(1)键值数据库的优点。①简单。②快速。③高效计算。④分布式处理。(2)键值数据库的缺点。①对值进行多值查找的功能较弱。②缺少约束,意味着更容易出错。③不易建立复杂关系。7.1初识NoSQL7.1.2NoSQL的数据存储模式和相对应的数据库4.图存储模式和图数据库图存储模式是一种专门存储节点和边以及节点之间的连线关系的拓扑存储方法。节点和边都存在描述参数,边是矢量,即有方向的,可能是单向的,也可能是双向的。在图存储模式中,每个节点都需要有指向其所有相连对象的指针,以实现快速的路由。图数据库中的节点都是相互连接的,因此对数据进行分片和分布式部署较为困难。相对于列族数据库、文档数据库、键值数据库而言,图数据库更具个性,更适合图论的应用。7.1初识NoSQL7.2走进HBase

7.2.1认识HBaseHBase是一种“面向列加键值对”存储模式的NoSQL数据库,底层的数据文件一般仍采用HDFS格式存储,但其文件结构和元数据等由HBase维护。为了实现并行的数据写入和检索,其元数据(分区信息)采用分布式方式管理,因此HBase在数据和元数据层面都是分布式的。HBase具有以下优点。采用面向列(列族)加键值对的存储模式。可以实现便捷的横向扩展。可以自动实现数据分片。可以实现严格的读写一致性和自动转移故障。可以实现对全文的检索与过滤。支持通过命令行界面或者Java、Python等语言来进行操作。7.2走进HBase7.2.1认识HBase1.HBase的数据模型HBase采用的是一种面向列加键值对存储模式,HBase不需要预先设计列的结构,当添加新的列时,只需要记录新记录的列名即可,不会对已有的数据产生影响。键值对的实际存储格式如图7.2走进HBaseHBase的每行数据或者说每个键值对都包含行键、列族名称、列名、时间戳、行键类型与值。需要记录其长度,键和值的最大长度(字符串长度)都是32KB。行键类型表明当前记录所表示的行为,如新增、删除、删除列、删除列族等。7.2.1认识HBase2.HBase的拓扑结构HBase节点采用了主/从式的拓扑结构,其主要组件包括一个主节点和若干个从节点。HBase需要借助Zookeeper来实现节点监控和容错。为实现Master节点的高可用性,可以部署多个Master节点,有一个为活跃(Active)节点,其他为备用(Standby)节点。HBase的典型架构如图7.2走进HBase7.2.1认识HBase3.水平分区原理HBase可以将数据表进行水平分割,形成不同的区域(Region),并由不同的Regionserver进行管理,以实现分布式的数据写入和查询。HBase的水平分区原理如图。7.2走进HBase7.2.2操作HBase1.查看HBase的基本信息使用HBase命令可以查看当前HBase的基本信息。【例1】查看当前HBase的基本信息。显示当前HBase的版本号。

hbase(main):020:0>version显示各主节点的状态。

hbase(main):021:0>status显示当前用户名。

hbase(main):022:0>whoam退出HBaseShell模式。

hbase(main):025:0>exit7.2走进HBase7.2.2操作HBase2.表和列族操作HBase的表结构只有表名和列族两项内容。列族属性及其说明如右表。7.2走进HBase7.2.2操作HBase2.表和列族操作HBaseShell中操作数据表的常用命令如表7.2走进HBase7.2.2操作HBase2.表和列族操作在HBaseShell中数据表和数据的读写等基本操作。(1)创建数据表。【例2】在HBaseShell中创建数据表。创建一个student数据表,数据表中含有一个列族address。hbase(main):001:0>create‘student’,‘address’创建一个student_info数据表,数据表中含有name和address两个列族。hbase(main):003:0>create‘student_info’,‘name’,‘address’创建book数据表,表中含有一个列族address。设定数据表中所有列族的分区单次持久化的最大值为128MB。hbase(main):006:0>create‘book’,‘address’,MAX_FILESTIZE=>‘134217728’7.2走进HBase7.2.2操作HBase2.表和列族操作(2)查看表名列表、数据表的信息等。【例3】查看数据表的信息。查看表名列表。hbase(main):008:0>list查看是否存在student数据表。hbase(main):009:0>exist‘student’描述student_info数据表的结构。hbase(main):011:0>describe‘student_info’7.2走进HBase7.2.2操作HBase2.表和列族操作(3)修改表结构。在student数据表中增加一个name列族,可以采用如下两种方式:alter‘student’,‘name’alter‘student’,‘address’,{NAME=>‘name’,INMEMORY=>true}删除一个列族及其包含的数据,可以采用如下两种方式:alter‘student’,‘delete’=>‘name’alter‘student’,{NAME=>‘name’,METHOD=>‘delete’}(4)删除数据表。如需要删除player数据表,先禁用player数据表:disable‘player’,可以用is_disabled命令查看禁用是否完成:is_disabled‘player’,然后删除数据表:drop‘player’。7.2走进HBase7.2.2操作HBase3.数据更新(1)数据插入。使用put命令可以实现单条数据的插入和修改。【例4】在student数据表的address列族中插入数据。hbase(main):020:0>put‘student’,‘001’,‘address:city’,‘nanjing’,1hbase(main):022:0>put‘student’,‘002’,‘address:nation’,‘China’hbase(main):024:0>put‘student’,‘002’,‘address:province’,‘jiangsu’(2)数据更新。执行put命令,则视为数据更新。put‘student’,‘001’,‘address:city’,‘suzhou’,2(3)数据删除。delete‘student’,‘002’,‘address’delete‘student’,‘002’,‘address:province’7.2走进HBase7.2.2操作HBase3.数据更新(4)计数器。使用incr命令可以将cell的数值在原值上加入指定数值。【例5】对student数据表的address列族中的room列以10为单位计数,连续两次累计计数。计数第一次

hbase(main):029:0>incr‘student’,‘001’,‘address:room’,10查看student数据表的address列族中的room列的值。

hbase(main):030:0>get‘student’,‘001’,‘address:room’计数第二次

hbase(main):031:0>incr‘student’,‘001’,‘address:room’,10查看student数据表的address列族中的room列的值。

hbase(main):032:0>get‘student’,‘001’,‘address:room’7.2走进HBase7.2.2操作HBase4.数据查询HBase中有两种基本的数据查询方法。(1)

get:根据行键获取一条数据。(2)

scan:扫描一个数据表,可以指定行键范围或使用过滤器限制范围。【例6】数据查询。在student数据表中插入数据。hbase(main):043:0>put‘student’,‘001’,‘address:city’,‘nanjinglishui’,1hbase(main):044:0>put‘student’,‘001’,‘address:city’,‘nanjingjiangling’,2hbase(main):045:0>put‘student’,‘001’,‘address:city’,‘nanjingxixia’按行键获取数据。get命令的必选参数为表名和行键名。hbase(main):046:0>get‘student’,‘001’7.2走进HBase7.2.2操作HBase4.数据查询(按行键、列族的名称、时间戳的范围、数据版本及过滤器获取数据。hbase(main):047:0>get‘student’,‘001’,{COLUMN=>‘address’}hbase(main):049:0>get‘student’,‘001’,{COLUMN=>‘address’,TIMERANGE=>[1,2]}hbase(main):051:0>get‘student’,‘001’,{COLUMN=>‘address’,VERSIONS=>3}hbase(main):052:0>get‘student’,‘001’,{COLUMN=>‘address’,TIMERANGE=>[1,2],VERSIONS=>3}hbase(main):053:0>get‘student’,‘001’,{FILTER=>“ValueFilter(=,‘binary:nanjianglishui’)”}若不指定行键扫描数据,则HBase通过全表扫描的方式查询数据。hbase(main):053:0>scan‘student’7.2走进HBase7.2.2操作HBase4.数据查询(3)

行计数。使用count命令可以计算数据表的逻辑行数。【例7】数据表的行统计。统计student数据表的逻辑行数。

hbase(main):070:0>count‘student’(4)

过滤查询。常见的过滤器如下。行键过滤器。列族和列名过滤器。值过滤器。7.2走进HBase7.2.2操作HBase5.快照操作快照是一种不复制数据就能建立表副本的方法,可以用于数据恢复,构建每日、每周或每月的数据报告,也可在测试中使用。【例8】快照操作。在HBaseShell中建立表的快照snapshot_one。

hbase(main):138:0>snapshot‘student’,‘snapshot_one’通过快照生成student_one数据表。

hbase(main):139:0>clone_snapshot‘snapshot_one’,‘student_one’查看快照列表。

hbase(main):140:0>list_snapshots通过快照恢复student数据表,将抛弃快照之后的所有变化。

hbase(main):141:0>restore_snapshot‘snapshot_one’7.2走进HBase7.2.3数据导入/导出1.批量导入数据(1)利用ImportTsv命令。在Linux操作系统中通过HBase指令调用ImportTsv命令。hbaseorg.apache.hadoop.hbase.mapreduce.ImportTsv-Dimporttsv.columns=HBASE_ROW_KEY,address:city,name:nick-Dimporttsv.skip.bad.lines=truestudenthdfs://namenode:8020/input/(2)bulk-load方法。该方法直接将原始数据转换成HFile,并将数据复制到HDFS的相应位置,再将文件中的数据纳入HBase管理(3)从关系型数据库中将数据导入HBase。在Hadoop组件中,Sqoop的组件可以实现Hadoop、Hive、HBase等大数据工具与关系型数据库(如MariaDB、Oracle)之间的数据导入和导出。7.2走进HBase7.2.3数据导入/导出【例9】Sqoop组件的操作。使用Sqoop组件列出MariaDB服务器中的所有数据库。sqooplist-databases--connectjdbc:mysql://localhost:3306--usernameroot--password000000使用Sqoop组件列出MariaDB中teaching_management数据库中所有的数据表。sqooplist-tables--connectjdbc:mysql://localhost:3306/teaching_management--usernameroot--password000000sqoopimport--connectjdbc:mysql://localhost:3306/teaching_management--tablestudent_info--hbase-tablestudent--column-familyinfo--hbase-row-keysno--hbase-create-table--username‘root’--password‘000000’7.2走进HBase7.2.3数据导入/导出2.备份和恢复(1)导出数据。利用下面的命令可以将HBase的数据导出到HDFS。

hbaseorg.apache.hadoop.hbase.mapreduce.Export<tablename><outputdir>(2)导入数据。将导出的数据恢复到HBase中,可以采用如下命令。

hbaseorg.apache.hadoop.hbase.mapreduce.Import<tablename><inputdir>(3)利用快照备份数据。将快照备份到HDFS,可以采用如下命令。

hbaseorg.apache.hadoop.hbase.snapshot.ExportSnapshot-snapshot<snap-shotname>--copy-to<outputdir>(4)复制数据表。

hbaseorg.apache.hadoop.hbase.mapreduce.CopyTable--=<NEW_TABLE_NAME>--peer.adr=<zookeeper_peer:2181://hbase><TABLE_NAME>7.2走进HBase7.3走进MongoDB7.3.1认识MongoDB目前常见的文档数据库有MongoDB和ApacheCouchDB等。

1.文档和集合MongoDB是典型的无模式NoSQL数据库,MongoDB会采用“文档”表示描述数据的结构。一组文档称为“集合”,可以类比传统关系型数据库中的“数据表”。但集合是无模式的,不同结构的文档可以归属于同一个集合。MongoDB采用BSON来进行数据存储与编码传输。其主要优势在于通过改进存储结构,BSON的检索速度更快。例如,BSON在实际存储时会将各个字段的长度存储在字段头部,因此在遍历数据时更容易跳过不需要的数据。BSON支持多种数据类型,如字符串、整型、浮点型等,这使得用户操作更加容易。7.3走进MongoDB7.3.1认识MongoDB1.文档和集合BSON支持的内嵌数据结构类型如表。7.3走进MongoDB7.3.1认识MongoDB2.分片机制MongoDB支持3种分片策略:升序分片、hash分片和位置分片。3.复制集MongoDB支持多副本,多副本是以主/从复制的形式实现的。MongoDB中称这种机制为复制集机制。MongoDB的复制集机制如图7.3走进MongoDB7.3.1认识MongoDB4.集群架构MongoDB集群存在分片机制时,存在3种基本角色Mongod(或称为Shard)服务器。Mongos服务器。Config服务器。MongoDB集群架构的拓扑结构如图7.3走进MongoDB7.3.1认识MongoDB5.存储引擎存储引擎是MongoDB的核心组件,负责将数据存储在硬盘和内存上。MongoDB支持以下3类存储引擎。(1)WiredTiger。它是目前推荐的存储引擎,支持文档级别的多副本和一致性管理、快照和检查点、操作日志、数据压缩等多种特性。(2)In-Memory。它用于将数据存储在内存中,将少量的元数据和诊断日志(Diagnosti-cLog)存储到硬盘文件中。(3)MMAPv1。它是MongoDB早期使用的存储引擎,一般认为其综合性能不如WiredTi-ger。由于存在时间较长,因此它对一些外围组件或第三方插件的支持会更好。7.3走进MongoDB7.3.2操作MongoDB1.MongoDB的Shell环境MongoShell是MongoDB的交互式JavaScript接口。可以使用MongoShell查询和更新数据及执行管理操作。MongoDB的Shell环境中有一个重要的db.runCommand命令,可以完成多种复杂的数据操作,命令格式为:db.runCommand({<command>})。db.runCommand命令可以完成数据库与大量节点环境的维护与管理工作。下面两条语句是基本等价的。db.mycol.find({item2:{$gt:1}})db.runCommand({find:“mycol”,filter:{item2:{$gt:1}}})7.3走进MongoDB7.3.2操作MongoDB1.MongoDB的Shell环境【例10】MongoDB的Shell环境的基础操作。登录MongoDB的Shell环境。

mongo或mongo--host:27017//IP地址为Mongos服务器的IP地址在Shell环境中执行help命令查看帮助主题。

>db.help>db.collection.help()执行db.runCommand命令。

>db.mycol.find({item2:{$gt:1}})

>db.runCommand({find:“mycol”,filter:{item2:{$gt:1}}})退出MongoDB的Shell环境。

>exit或quit()7.3走进MongoDB7.3.2操作MongoDB2.数据库操作和集合操作(1)数据库操作。①查看当前连接的服务器。

db.getMongo()②查看数据库列表。

showdbs③切换使用的数据库。

use<db>④显示当前数据库名称。

db7.3走进MongoDB7.3.2操作MongoDB2.数据库操作和集合操作⑤查看当前数据库中的所有集合。

showcollections⑥查看当前数据库中的所有集合,并以JSON方式显示集合名称。

db.getCollectionNames()⑦查看当前数据库中详细的集合信息。

db.getCollectionInfos()⑧删除当前数据库,并删除相关数据。

db.dropDatabase()7.3走进MongoDB7.3.2操作MongoDB2.数据库操作和集合操作(2)集合操作。①新建集合。

db.createCollection(<name>)②删除集合。

db.myCol.drop()③定长集合操作。除了指定名称,新建集合命令还可以附加若干可选参数。例如:

db.createCollection(“cappedCol”,{capped:true,size:10000})④判断一个集合是否为capped属性。 db.cappedCol.isCapped()7.3走进MongoDB7.3.2操作MongoDB3.文档插入、查询、更新、删除操作(1)文档插入。①插入单个文档的命令及语法。 db.collection.insertOne(document)②插入多个文档。db.collection.insertMany()将多个文档插入一个集合中。

db.mycol.insertMany(doc1,doc2)(2)文档查询。①查询集合中的所有文档,在find方法中传一个空文档作为查询过滤条件。 db.mycol.find({})②以易读方式显示查询结果。 db.mycol.find({}).pretty()7.3走进MongoDB7.3.2操作MongoDB3.文档插入、查询、更新、删除操作③等值查询。在查询过滤文档中使用<字段>:<值>的表达式实现等值查询。 db.mycol.find({item2:‘item2’})④在查询条件中使用查询操作符。查询过滤文档中可以使用查询操作符来指定多个条件。 db.mycol.find({item1:{$in:[“A”,“D”]}})(3)文档更新。①更新单个文档。 db.collection.updateOne(<filter>,<update>,<options>)②更新多个文档。 db.collection.updateMany(<filter>,<update>,<options>)③更换文档。db.collection.replaceOne(<filter>,<update>,<options>)7.3走进MongoDB7.3.2操作MongoDB3.文档插入、查询、更新、删除操作(4)文档删除。①删除集合中的单个文档。 db.collection.deleteOne(<filter>,{writeConcern:<document>,collation:<document>,hint:<document|string>})②删除集合中所有匹配的文档。 db.collection.deleteMany(<filter>,{writeConcern:<document>,collation:<document>})7.3走进MongoDB7.3.2操作MongoDB3.文档插入、查询、更新、删除操作【例11】在MongoDB中新建student数据库,新建compute集合,使用for循环向集合中批量插入10条数据,定义变量i=1,插入{_id:i,name:“xiaoming”,age:21}。插入数据完毕后,统计集合中的数据条数,然后查询集合中age大于20的记录。>usestudent>db.createCollection(“compute”)>for(vari=1;i<10;i++){pute.insertOne({_id:i,name:“xiaoming”,age:18+i})}>pute.count()>pute.find({age:{$gt:20}}).pretty();7.3走进MongoDB7.3.2操作MongoDB4.聚合聚合为集合文档数据库提供各种处理数据的方法,并返回计算结果。MongoDB提供了3种方式来执行聚合命令:聚合管道方法、MapReduce方法和单用途聚合方法。(1)聚合管道方法。常见的管道操作包括$group、$project、$match、$sort、$limit和$skip等。常见的聚合运算符包括$sum、$avg、$min/$max、$first/$last和$push等。常见的比较运算符包括$gt/$lt、$gte/$lte、$ne等。(2)MapReduce方法。语法格式:db.collection.mapreduce(function(){emit(<this.field1>,<this.field2>)},//map自定义函数function(key,values){returnArray.sum(values)},//reduce自定义函数{query:{<field>},out:<“result_name”>})7.3走进MongoDB7.3.2操作MongoDB4.聚合(3)单用途聚合方法。单用途聚合方法可以放在find命令后直接使用。目前有两种单用途聚合操作:db.collection_name.count()和db.collection_name.distinct(),可用来聚合来自单个集合的文档。①db.collection_name.count()表示统计集合里符合查询条件的文档数量。②db.collection_name.distinct()表示统计集合里指定键的不同值。7.3走进MongoDB7.3.2操作MongoDB5.索引MongoDB的索引是基于“B-树数据结构”及对应算法形成的。(1)默认id索引。在创建集合期间,MongoDB在_id字段上创建唯一索引。(2)创建索引。使用db.collection.createIndex()命令在MongoShell中创建索引。 db.collection.createIndex(<keyandindextypespecification>,<options>)例如,在student集合的name字段上创建单个键降序索引。 db.student.createIndex({name:-1})考虑一个经常查询products集合以填充现有库存数据为目标的应用程序。 ducts.cre

温馨提示

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

最新文档

评论

0/150

提交评论