nosql数据库的四种类型如下:
创新互联公司欢迎咨询:13518219792,为您提供成都网站建设网页设计及定制高端网站建设服务,创新互联公司网页制作领域10年,包括自拌料搅拌车等多个领域拥有多年的网站营销经验,选择创新互联公司,为企业保驾护航!
1.key-value键值存储数据库:
相关产品: Redis、Riak、SimpleDB、Chordless、Scalaris、Memcached.
主要应用: 内容缓存,处理大量数据的高负载访问,也用于系统日志。
优点:查找速度快,大量操作时性能高。
2.列存储数据库:
相关产品: BigTable、HBase、Cassandra、HadoopDB、GreenPlum、PNUTS.
主要应用: 分布式数据的储存与管理。
优点:查找速度快,可扩展性强,容易进行分布式扩展。
缺点:功能相对局限。
3.文档型数据库
相关产品:MongoDB、CouchDB、ThruDB、CloudKit、Perservere、Jackrabbit.
主要应用: web应用,管理面向文档的数据或者类似的半结构化数据。
优点:数据结构灵活,表结构可变,复杂性低。
缺点:查询效率低,且缺乏统一的查询语言。
4.Graph图形数据库
相关产品: Neo4J、OrientDB、InfoGrid、GraphDB.
主要应用: 复杂,互连接,低结构化的图结构场合, 专注构建关系图谱。
优点: 利用图结构相关算法, 可用于构建复杂的关系图谱。
缺点: 复杂度高。
AWS推出了与SQL兼容的查询语言PartiQL,只要数据库查询引擎提供PartiQL支持,使用者就能以PartiQL单一查询关联式数据库的结构化资料,以及开放资料格式中的巢状资料或是半结构化资料,甚至还能用来查询NoSQL或是文件数据库中无固定结构(Schema-less)的资料。除了AWS自家的数据库服务,NoSQL数据库Couchbase Server也承诺将会支持PartiQL。
企业资料分散在关联式数据库、非关联式数据库以及资料湖泊中。高度结构化的资料,储存在SQL数据库或是资料仓储;无固定结构的资料则由键值储存、图形数据库(Graph Database)、分类帐数据库或是时间序列数据库等NoSQL数据库处理;而在资料湖泊中的资料,可能也有部分缺乏结构,或是可能为巢状或是多值结构。不同的资料类型适用于不同的使用案例,而每种类型的资料,可能都有自己的查询语言。
不同的资料储存对应不同的查询语言,当企业更换资料格式或是数据库引擎时,可能还需要跟着改变应用程式和查询语法,AWS提到,这对于资料的应用,特别是使用资料湖泊的灵活性与效率,有着很大的阻碍。为了统一不同类型数据库存取方法,AWS发布了查询语言PartiQL,这是个与SQL兼容的查询语言,可以用来查询以各种格式储存在各地的资料。
用户可以使用PartiQL来查询关联式数据库,像是在Redshift实作交易或是资料分析等应用,或对于Amazon S3资料湖泊的开放资料格式,同样能使用PartiQL对巢状资料与半结构化资料例如Amazon Ion格式进行查询,另外,PartiQL也可用于文件数据库等NoSQL数据库,查询无固定结构的资料。
AWS表示,PartiQL的出现,是为了满足自家查询和转换大量资料的需求,其提供严格的SQL兼容性,可与标准SQL混合使用,执行连接(Join)、过滤(Filtering)与聚合(Aggregation)操作,并以最小扩充支持巢状和半结构化资料,让开发者以简单且一致的方法,不需要更改查询语言,就能查询各种格式和服务的资料。
PartiQL具格式独立性与储存独立性,PartiQL语法和语义不依赖任何资料格式,无论使用者是要查询JSON、Parquet、ORC、CSV还是Ion等格式,查询语句的写法都相同,PartiQL的查询在综合逻辑类型系统上运作,才对应到不同底层的格式。而PartiQL也不相依于特定资料储存,因此适用于不同的底层资料储存。
虽然过去针对跨不同类型数据库查询的问题,已有不少解决方案,AWS指出,像是Postgres JSON同样也兼容于SQL,但是却无法良好地处理JSON巢状资料;而半结构化查询语言,虽然能良好处理巢状资料,但却无法与SQL语言兼容。AWS提到,PartiQL是第一个能够完全解决这些问题的查询语言。
目前AWS已在自家多项服务支持PartiQL,包括Amazon S3 Select、Amazon Glacier Select、Amazon Redshift Spectrum、Amazon QLDB,接下来几个月将会有更多的AWS服务支持PartiQL,Couchbase也公布将加入支持PartiQL的行列。现在PartiQL以Apache2.0授权许可开源,公开教学、规范以及参考实作,所有社群都能使用并参与贡献。
答案:A
1.文档型数据库
作为最受欢迎的NoSQL产品,文档型数据库MongoDB当仁不让地占据了第一的位置,同时它也是所有NoSQL数据库中排名最靠前的产品(总排行榜第七名)。Apache基金会的CouchDB排在第二,基于.Net的数据库RavenDB排在第三,Couchbase排在第四。
2.键值(Key-value)数据库
键值(Key-value)数据库是NoSQL领域中应用范围最广的,也是涉及产品最多的一种模型。从最简单的BerkeleyDB到功能丰富的分布式数据库Riak再到Amazon托管的DynamoDB不一而足。
在键值数据库流行度排行中,Redis不出意外地排名第一,它是一款由Vmware支持的内存数据库,总体排名第十一。排在第二位的是Memcached,它在缓存系统中应用十分广泛。排在之后的是Riak、BerkeleyDB、SimpleDB、DynamoDB以及甲骨文的Oracle NoSQL数据库。值得注意的是,Oracle NoSQL数据库上榜不久,得分已经翻番,上升势头非常迅猛。
3. 列式存储
列式存储被视为NoSQL数据库中非常重要的一种模式,其中Cassandra流行度最高,它已经由Facebook转交给到Apache进行管理,同时Cassandra在全体数据库排名中排在第十位,紧随MongoDB成为第二受欢迎的NoSQL数据库。基于Hadoop的Hbase排在第二位,Hypertable排在第三。而Google的BigTable并未列入排名,原因是它并未正式公开。
a. SQL数据存在特定结构的表中;而NoSQL则更加灵活和可扩展,存储方式可以省是JSON文档、哈希表或者其他方式。
b. 在SQL中,必须定义好表和字段结构后才能添加数据,例如定义表的主键(primary key),索引(index),触发器(trigger),存储过程(stored procedure)等。表结构可以在被定义之后更新,但是如果有比较大的结构变更的话就会变得比较复杂。在NoSQL中,数据可以在任何时候任何地方添加,不需要先定义表。
c. SQL中如果需要增加外部关联数据的话,规范化做法是在原表中增加一个外键,关联外部数据表。而在NoSQL中除了这种规范化的外部数据表做法以外,我们还能用如下的非规范化方式把外部数据直
接放到原数据集中,以提高查询效率。缺点也比较明显,更新审核人数据的时候将会比较麻烦。
d. SQL 中可以使用JOIN表链接方式将多个关系数据表中的数据用一条简单的查询语句查询出来。NoSQL暂未提供类似JOIN的查询方式对多个数据集中的数据做查询。所以大部分NoSQL使用非规范化的数据存储方式存储数据。
e. SQL中不允许删除已经被使用的外部数据,而NoSQL中则没有这种强耦合的概念,可以随时删除任何数据。
f. SQL中如果多张表数据需要同批次被更新,即如果其中一张表更新失败的话其他表也不能更新成功。这种场景可以通过事务来控制,可以在所有命令完成后再统一提交事务。而NoSQL中没有事务这个概念,每一个数据集的操作都是原子级的。
g. 在相同水平的系统设计的前提下,因为NoSQL中省略了JOIN查询的消耗,故理论上性能上是优于SQL的。
NoSQL数据库有很多种,实现方式差别很大。有接近SQL查询方式的,也有纯粹的键值对查询。
对于K-V型数据库,比较典型的是Redis,系统提供了get、set之类的命令用于增删改查。关键是键值对的键和值怎么设计。
package basic;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBC {
public void findAll() {
try {
// 获得数据库驱动
//由于长时间不写,驱动名和URL都忘记了,不知道对不对,你应该知道的,自己改一下的哈
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "system";
String password = "system";
Class.forName("oracle.jdbc.driver.OracleDriver");
// 创建连接
Connection conn = DriverManager.getConnection(url, userName,
password);
// 新建发送sql语句的对象
Statement st = conn.createStatement();
// 执行sql
String sql = "select * from users";
ResultSet rs = st.executeQuery(sql);
// 处理结果
while(rs.next()){
//这个地方就是给你的封装类属性赋值
System.out.println("UserName:"+rs.getString(0));
}
// 关闭连接
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void delete(){
try {
//步骤还是那六个步骤,前边的两步是一样的
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "system";
String password = "system";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(url,userName,password);
//这里的发送sql语句的对象是PreparedStatement,成为预处理sql对象,因为按条件删除是需要不定值的
String sql = "delete from users where id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(0, 1);
int row = ps.executeUpdate();
if(row!=0){
System.out.println("删除成功!");
}
// 关闭连接
rs.close();
st.close();
conn.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}