实验内容: 一、关系型数据库与非关系型数据库 二、典型的NoSQL数据库 三、使用Redis常用命令 四、使用MongoDB常用命令
一、关系型数据库与非关系型数据库 当前主流的关系型数据库有Oracle、DB2、MySQL等。 非关系型数据库有 NoSql、Cloudant。 1、关系型数据库通过外键关联来建立表与表之间的关系; 2、非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。
比如, 有一个学生的数据: 姓名:张三,性别:男,学号:12345,班级:二年级一班 还有一个班级的数据: 班级:二年级一班,班主任:李四
关系型数据库中,我们创建学生表和班级表来存这两条数据,并且学生表中的班级存储的是班级表中的主键。
非关系型数据库中,我们创建两个对象,一个是学生对象,一个是班级对象, 用Java来表示就是: class Student { String id; String name; String sex; String number; String classid; } class Grade { String id; String name; String teacher; } 通过设置Student类的classid等于Grade类的id来建立这种关系;
非关系型数据库中,我们查询一条数据,结果出来一个数组,关系型数据库中,查询一条数据结果是一个对象。 二、典型的NoSQL数据库 临时性键值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库(MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase)
三、使用Redis常用命令 1、DEL key 该命令用于在 key 存在是删除 key 2 、DUMP key 序列化给定 key ,并返回被序列化的值 3、 EXISTS key 检查给定 key 是否存在 4、 EXPIRE key seconds 为给定 key 设置过期时间 5、 EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间,不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp) 6 、PEXPIRE key milliseconds 设置 key 的过期时间亿以毫秒计 7、 PEXPIREAT key milliseconds-timestamp 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 8 、KEYS pattern 查找所有符合给定模式( pattern)的 key 9 、MOVE key db 将当前数据库的 key 移动到给定的数据库 db 当中 10 、PERSIST key 移除 key 的过期时间,key 将持久保持 11 、PTTL key 以毫秒为单位返回 key 的剩余的过期时间 12、 TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 13、 RANDOMKEY 从当前数据库中随机返回一个 key 14、 RENAME key newkey 修改 key 的名称 15 、RENAMENX key newkey 仅当 newkey 不存在时,将 key 改名为 newkey 16 、TYPE key 返回 key 所储存的值的类型
四、使用MongoDB常用命令 由于以前用的数据库都是 SQL 的语法,近期学习了 NoSQL 之 MongoDB 后,做了以下总结:
首先,传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。 mongoDB语法:
MongoDB的好处挺多的,比如多列索引,查询时可以用一些统计函数,支持多条件查询,但是目前多表查询是不支持的,可以想办法通过数据冗余来解决多表查询的问题。 MongoDB对数据的操作很丰富,下面做一些举例说明,内容大部分来自官方文档,另外有部分为自己理解。 查询colls所有数据 db.colls.find() //select * from colls 通过指定条件查询 db.colls.find({‘last_name’: ‘Smith’});//select * from colls where last_name=’Smith’ 指定多条件查询 db.colls.find( { x : 3, y : “foo” } );//select * from colls where x=3 and y=’foo’ 指定条件范围查询 db.colls.find({j: {KaTeX parse error: Expected 'EOF', got '}' at position 6: ne: 3}̲, k: {gt: 10} });//select * from colls where j!=3 and k>10 查询不包括某内容 db.colls.find({}, {a:0});//查询除a为0外的所有数据 支持<, <=, >, >=查询,需用符号替代分别为 l t , lt, lt,lte, g t , gt, gt,gte db.colls.find({ “field” : { $gt: value } } ); db.colls.find({ “field” : { $lt: value } } ); db.colls.find({ “field” : { $gte: value } } ); db.colls.find({ “field” : { $lte: value } } ); 也可对某一字段做范围查询 db.colls.find({ “field” : { $gt: value1, $lt: value2 } } ); 不等于查询用字符ne db.colls.find( { x : { KaTeX parse error: Expected 'EOF', got '}' at position 8: ne : 3 }̲ } ); 取模查询用字符mod db.colls.find( { a : { $mod : [ 10 , 1 ] } } )// where a % 10 == 1 $all查询 db.colls.find( { a: { $all: [ 2, 3 ] } } );//指定a满足数组中任意值时 $size查询 db.colls.find( { a : { $size: 1 } } );//对对象的数量查询,此查询查询a的子对象数目为1的记录 $exists查询 db.colls.find( { a : { $exists : true } } ); // 存在a对象的数据 db.colls.find( { a : { $exists : false } } ); // 不存在a对象的数据 使用正则表达式匹配 db.colls.find( { name : /acme.*corp/i } );//类似于SQL中like 内嵌对象查询 db.colls.find( { “author.name” : “ritter” } ); $in & $nin 相当于 SQL 中的:in & not in sort()排序 db.colls.find().sort( { ts :