市面常见数据存储方式的简单介绍

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 下面是市面上一些存储方式概念的简单介绍,包含关系型数据库,非关系型数据库,内存数据库,数据仓库,对象存储,图数据库,时序数据库和多维数据库

关系型数据库

关系型数据库使用表格(table)来存储数据,并使用SQL(Structured Query Language)进行操作,表格中包含行(row)和列(column)。具有数据结构清晰、支持事务处理等优点,但扩展性差、读写效率相对较低。常见的有MySQL、Oracle、Microsoft SQL Server等。

存储方式

关系型数据库通常使用磁盘来存储数据。数据被组织成表格的形式,表格中的每一行表示一个记录,每一列表示一个字段,表格中的数据可以使用 SQL 语言进行查询和操作。

使用方式

关系型数据库通常使用 SQL 语言进行操作和查询,通过创建表格来存储数据,可以使用关系代数等数学方法进行表格的操作和查询。

优缺点

优点:

  1. 数据结构清晰,方便查询和管理。
  2. 支持事务处理,保证数据的完整性和一致性。
  3. SQL 查询语言使用广泛,易于学习和使用。

缺点:

  1. 扩展性差,无法应对海量数据的存储和处理。
  2. 读写效率相对较低,难以满足高并发的需求。

适用场景

关系型数据库适用于对数据结构要求较高,事务处理较为重要的应用场景,如银行、证券等金融行业、ERP 系统等企业管理系统等。

代码展示

该代码使用了 JDBC API 连接 MySQL 数据库,并通过创建 Statement 对象执行 SQL 语句,向名为 "users" 的表格中插入了一条记录。这只是一个简单的示例,实际上 JDBC API 还提供了很多其他功能,如批量操作、预编译语句等。

importjava.sql.*;
publicclassJdbcExample {
publicstaticvoidmain(String[] args) {
Stringurl="jdbc:mysql://localhost:3306/test";
Stringusername="root";
Stringpassword="password";
Stringsql="INSERT INTO users (id, name, age) VALUES (1, 'Alice', 20)";
try {
// 创建连接Connectionconn=DriverManager.getConnection(url, username, password);
// 创建 Statement 对象Statementstmt=conn.createStatement();
// 执行 SQL 语句introws=stmt.executeUpdate(sql);
// 输出执行结果System.out.println("Inserted "+rows+" rows.");
// 关闭连接stmt.close();
conn.close();
        } catch (SQLExceptione) {
e.printStackTrace();
        }
    }
}

非关系型数据库

非关系型数据库(NoSQL)采用非结构化的数据模型进行数据的存储和查询,通常具有分布式、高可扩展、高可用性和高并发处理等特点。常见的非关系型数据库有键值存储、文档存储、列存储和图形存储等。

目前主流的 NoSQL 数据库有以下几种类型:

  • 键值存储数据库(Key-Value Store Database):以键值对的形式存储数据,例如 Redis、Memcached 等。
  • 列族存储数据库(Column Family Store Database):以列族的形式存储数据,例如 HBase、Cassandra 等。
  • 文档数据库(Document Database):以类似 JSON 格式的文档形式存储数据,例如 MongoDB、CouchDB 等。
  • 图形数据库(Graph Database):以节点和边的形式存储数据,例如 Neo4j、ArangoDB 等。
  • 对象数据库(Object Database):以对象的形式存储数据,例如 db4o 等。

存储方式

非关系型数据库通常采用分布式存储结构,可以通过水平扩展来应对大规模数据的存储和处理。

使用方式

非关系型数据库不使用 SQL 作为查询语言,通常使用特定的 API 进行操作。

优缺点

优点:

  1. 可以轻松应对海量数据的存储和处理。
  2. 具有较高的可扩展性和可用性,支持分布式部署。
  3. 支持高并发的读写操作,具有较好的性能表现。

缺点:

  1. 数据结构较为灵活,不方便管理和查询。
  2. 缺乏事务处理能力,难以保证数据的一致性和完整性。

适用场景

非关系型数据库适用于数据结构不规则、读写频繁、需要高可扩展性和高性能的场景,如大型互联网应用、移动应用、物联网等。

代码展示

在代码中,我们首先创建了一个 MongoClient 对象,然后使用连接字符串连接到本地的 MongoDB 实例。然后,我们使用 MongoClient 对象获取指定的数据库和集合对象,并使用 insertOne() 方法向集合中插入一条文档。接下来,我们使用 find() 方法查询指定条件的文档,并使用 updateOne() 方法更新文档,使用 deleteOne() 方法删除文档。最后,我们关闭 MongoClient 对象,释放连接。

importcom.mongodb.client.MongoClients;
importcom.mongodb.client.MongoCollection;
importcom.mongodb.client.MongoDatabase;
importorg.bson.Document;
publicclassMongoDBExample {
publicstaticvoidmain(String[] args) {
// 连接 MongoDB 数据库StringconnectionString="mongodb://localhost:27017";
MongoClientmongoClient=MongoClients.create(connectionString);
// 获取指定数据库MongoDatabasedatabase=mongoClient.getDatabase("test");
// 获取指定集合MongoCollection<Document>collection=database.getCollection("students");
// 插入文档Documentdocument=newDocument("name", "张三").append("age", 20);
collection.insertOne(document);
// 查询文档Documentquery=newDocument("name", "张三");
Documentresult=collection.find(query).first();
System.out.println(result.toJson());
// 更新文档Documentupdate=newDocument("$set", newDocument("age", 21));
collection.updateOne(query, update);
// 删除文档collection.deleteOne(query);
// 关闭连接mongoClient.close();
    }
}

内存数据库

内存数据库(In-Memory Database)是指将数据存储在计算机内存中,而非传统的磁盘存储方式。内存数据库具有高速的数据读写能力和低延迟,适合对数据处理速度要求较高的场景,如高频交易、广告推荐、游戏等。内存数据库主要有 Redis、Memcached 等。

存储方式

内存数据库通常使用计算机内存来存储数据。

使用方式

内存型数据库使用方式类似于传统关系型数据库,但是数据存储在内存中,而非硬盘。开发人员通过API调用内存数据库进行数据读写操作,其速度较快。内存数据库的使用需要考虑内存容量,数据会随着应用程序的重启而丢失。内存型数据库适用于数据查询、分析等对响应速度有较高要求的应用场景。

优缺点

优点:

  1. 高速的数据读写能力和低延迟;
  2. 可以缓存热数据,提高系统的响应速度;
  3. 支持事务处理,保证数据的一致性和完整性。

缺点:

  1. 数据容量受限于内存大小,无法存储大规模数据;
  2. 数据持久化能力较弱,需要定期备份数据;
  3. 数据结构较为简单,不支持复杂的查询操作。

适用场景

适用于对数据处理速度要求较高的场景,如高频交易、广告推荐、游戏等。

代码展示

这段代码实现了一个基本的 Redis 操作示例,包括连接 Redis 服务器、插入数据、读取数据、更新数据和删除数据等操作。

importredis.clients.jedis.Jedis;
publicclassRedisExample {
publicstaticvoidmain(String[] args) {
// 连接 Redis 数据库Jedisjedis=newJedis("localhost", 6379);
// 插入数据jedis.set("name", "张三");
// 读取数据Stringname=jedis.get("name");
System.out.println(name);
// 更新数据jedis.set("name", "李四");
// 删除数据jedis.del("name");
// 关闭连接jedis.close();
    }
}

数据仓库

数据仓库更像是一种概念,它是一个面向主题、集成、时间性和非易失性的数据集合,用于支持企业决策和分析。数据仓库通常包括多个来源的数据,这些数据经过清洗、转换和整合后,被存储在一个单一的位置,供用户进行查询和分析。数据仓库的实现方式可以是关系型数据库、列式数据库、内存数据库等。

存储方式

数据仓库一般采用星型、雪花型或星座型数据模型,使用多维数组或RDBMS存储数据。

使用方式

数据仓库主要用于支持决策和业务智能,可以通过OLAP工具进行多维分析查询,如钻取、切片、切块等。

优缺点

优点:能够处理大量数据,支持复杂查询和多维分析,提供灵活的报表和可视化功能,能够支持决策和业务智能。

缺点:构建和维护成本较高,需要专业技术人员的支持,数据更新周期较长。

适用场景

数据仓库适用于数据量大、数据源多、数据结构复杂的情况下,如企业经营决策、市场分析、客户管理等。

代码展示

连接 Hive 需要使用 Hive JDBC 驱动程序,该驱动程序包含在 Hive 的 lib 目录中,需要将其添加到 Java 的类路径中。此外,Hive 的默认 JDBC URL 为 jdbc:hive2://localhost:10000/default,其中 localhost 是 HiveServer2 所在的主机名,10000 是 HiveServer2 的默认端口,default 是默认的数据库名称,可以根据实际情况进行修改。

importjava.sql.*;
publicclassHiveExample {
publicstaticvoidmain(String[] args) throwsSQLException {
// 连接 HiveStringdriverName="org.apache.hive.jdbc.HiveDriver";
Stringurl="jdbc:hive2://localhost:10000/default";
Stringusername="hiveuser";
Stringpassword="hivepassword";
try {
Class.forName(driverName);
        } catch (ClassNotFoundExceptione) {
e.printStackTrace();
System.exit(1);
        }
Connectionconn=DriverManager.getConnection(url, username, password);
Statementstmt=conn.createStatement();
// 创建表格StringtableName="test";
stmt.execute("DROP TABLE IF EXISTS "+tableName);
stmt.execute("CREATE TABLE "+tableName+" (id INT, name STRING)");
// 插入数据Stringsql="INSERT INTO "+tableName+" VALUES (1, '张三'), (2, '李四')";
stmt.execute(sql);
// 查询数据ResultSetres=stmt.executeQuery("SELECT * FROM "+tableName);
while (res.next()) {
intid=res.getInt("id");
Stringname=res.getString("name");
System.out.println("id: "+id+", name: "+name);
        }
// 删除表格stmt.execute("DROP TABLE "+tableName);
// 关闭连接res.close();
stmt.close();
conn.close();
    }
}

对象存储

对象存储(Object Storage)是一种以对象为基本存储单元的云存储服务,相比于传统的文件系统存储,对象存储更具扩展性、可靠性和可用性。

存储方式

对象存储将数据存储为对象(Object),每个对象由元数据(Metadata)和数据(Data)两部分组成,元数据包含对象的描述信息,数据则是对象的内容。对象存储通常使用分布式文件系统(例如HDFS)或对象存储系统(例如Amazon S3、Alibaba Cloud OSS等)来存储对象数据,同时提供API接口来进行读写操作。

使用方式

使用对象存储时,用户需要通过API接口来进行数据的上传、下载、删除等操作,每个对象都有唯一的标识符(Object Identifier)用于标识对象的位置和元数据,用户可以使用标识符来对对象进行操作。对象存储一般具有高度可扩展性、强大的访问控制和数据安全机制等特点,适合存储海量数据、大文件和静态数据等场景。

优缺点

优点包括:

  • 可扩展性:对象存储可以在分布式系统中进行无限扩展,具有更高的容量和性能;
  • 数据安全:对象存储提供高级别的数据安全机制,例如数据加密、访问控制和数据备份等;
  • 高可用性:对象存储可以提供高可用性,以保证数据的可靠性;
  • 节省成本:相比于传统的存储方案,对象存储通常具有更低的成本。

缺点包括:

  • 读写性能可能会受到限制,尤其是在高并发和低延迟的场景下;
  • 对象存储通常需要使用API接口进行操作,相比于传统的文件系统存储需要更多的开发成本。

适用场景

  • 海量数据存储:适用于需要存储海量数据、大文件和静态数据等场景;
  • 数据备份:适用于数据备份和灾难恢复等场景;
  • 多媒体文件存储:适用于存储视频、音频和图像等多媒体文件;
  • 分布式应用程序:适用于需要在多个节点之间共享数据的分布式应用程序等场景。

代码展示

代码演示了如何连接阿里云对象存储OSS,并进行Bucket的创建、列出、文件上传、下载和删除等操作。

importcom.aliyun.oss.OSS;
importcom.aliyun.oss.OSSClientBuilder;
importcom.aliyun.oss.model.Bucket;
importcom.aliyun.oss.model.GetObjectRequest;
importcom.aliyun.oss.model.ObjectMetadata;
importcom.aliyun.oss.model.PutObjectRequest;
importjava.io.File;
importjava.util.List;
publicclassOSSExample {
publicstaticvoidmain(String[] args) {
// 阿里云OSS的访问密钥StringaccessKeyId="yourAccessKeyId";
StringaccessKeySecret="yourAccessKeySecret";
// OSS的Endpoint,需要根据具体的区域设置Stringendpoint="http://oss-cn-hangzhou.aliyuncs.com";
// 创建OSSClient对象OSSossClient=newOSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 创建BucketStringbucketName="my-oss-bucket";
if (!ossClient.doesBucketExist(bucketName)) {
ossClient.createBucket(bucketName);
        }
// 列出BucketList<Bucket>buckets=ossClient.listBuckets();
for (Bucketbucket : buckets) {
System.out.println(bucket.getName());
        }
// 上传文件StringobjectName="example.txt";
Filefile=newFile("example.txt");
PutObjectRequestputObjectRequest=newPutObjectRequest(bucketName, objectName, file);
ossClient.putObject(putObjectRequest);
// 下载文件GetObjectRequestgetObjectRequest=newGetObjectRequest(bucketName, objectName);
ossClient.getObject(getObjectRequest, newFile("example_downloaded.txt"));
// 删除文件ossClient.deleteObject(bucketName, objectName);
// 关闭OSSClient对象ossClient.shutdown();
    }
}

图数据库

图数据库是一种特殊的数据库类型,它以图形的形式存储数据,将数据以节点和边的形式表示,用于处理复杂的数据关系和查询。

存储方式

图数据库通常采用“图”来存储数据,其中节点表示实体,边表示实体之间的关系。通常使用邻接列表、邻接矩阵等数据结构存储节点和边信息。

使用方式

图数据库适合存储具有复杂关系的数据,如社交网络、推荐系统等。它们通常使用图形查询语言(如Cypher)来查询和修改数据,通过节点和边之间的关系进行导航和遍历。

优缺点

图数据库能够快速处理大量复杂的数据关系,具有高效的查询和数据分析能力,可以轻松处理复杂的查询和分析需求。但是,它们通常比传统的关系型数据库更难以维护和更新,也需要更多的计算资源。

适用场景

图数据库适用于需要处理大量复杂数据关系的场景,如社交网络分析、知识图谱等。

代码展示

示例使用了Neo4j官方提供的Java驱动程序,实现了连接Neo4j图数据库、创建节点、查询节点、更新节点和删除节点等基本操作。其中,创建节点使用了Cypher查询语言,该语言是Neo4j的标准查询语言,类似于SQL语言,用于操作图数据库中的节点和关系。查询节点使用了MATCH和RETURN子句,用于匹配指定节点和返回查询结果。更新节点使用了SET子句,用于设置节点属性值。删除节点使用了DELETE子句,用于删除指定节点。

importorg.neo4j.driver.*;
publicclassNeo4jExample {
publicstaticvoidmain(String[] args) {
// 连接 Neo4j 数据库Stringuri="bolt://localhost:7687";
Stringuser="neo4j";
Stringpassword="password";
Driverdriver=GraphDatabase.driver(uri, AuthTokens.basic(user, password));
// 获取会话Sessionsession=driver.session();
// 插入节点session.run("CREATE (n:Person {name: $name, age: $age})", 
parameters("name", "张三", "age", 20));
// 查询节点Resultresult=session.run("MATCH (n:Person) WHERE n.name = $name RETURN n.age", 
parameters("name", "张三"));
while (result.hasNext()) {
Recordrecord=result.next();
System.out.println(record.get("n.age").asInt());
        }
// 更新节点session.run("MATCH (n:Person) WHERE n.name = $name SET n.age = $age", 
parameters("name", "张三", "age", 21));
// 删除节点session.run("MATCH (n:Person) WHERE n.name = $name DELETE n", 
parameters("name", "张三"));
// 关闭会话和驱动程序session.close();
driver.close();
    }
}

时序数据库

时序数据库是一种专门用于存储和查询时间序列数据的数据库。它使用了一系列特定的技术来优化时间序列数据的存储和查询,以提高性能和效率。

存储方式

时序数据库通常采用列式存储方式,它把相同的数据类型的数据放在一起存储,以便更快地查询数据。时序数据库还可以使用数据压缩技术来减少存储空间的使用。

使用方式

时序数据库通常提供一些专门的API或者查询语言来支持时间序列数据的插入、查询、更新和删除。开发人员可以使用这些API或者查询语言来构建自己的应用程序。

优缺点

时序数据库的优点包括高效、可扩展性强、支持实时查询、易于管理、数据安全等。但是,它也存在一些缺点,如存储数据的时间范围有限、可用性低、查询语言不够强大等。

适用场景

时序数据库适用于需要存储和查询时间序列数据的应用场景,如物联网、日志分析、金融交易、电力系统等。

代码展示

示例展示了如何使用Java连接InfluxDB,并进行数据的插入和查询。

importorg.influxdb.InfluxDB;
importorg.influxdb.InfluxDBFactory;
importorg.influxdb.dto.Query;
importorg.influxdb.dto.QueryResult;
publicclassInfluxDBExample {
publicstaticvoidmain(String[] args) {
// 连接 InfluxDB 数据库InfluxDBinfluxDB=InfluxDBFactory.connect("http://localhost:8086", "username", "password");
StringdbName="mydb";
influxDB.setDatabase(dbName);
// 插入数据Stringmeasurement="cpu_load_short";
StringtagKey="host";
StringtagValue="server01";
StringfieldKey="value";
doublefieldValue=0.64;
influxDB.write(String.format("%s,%s=%s %s=%s", measurement, tagKey, tagValue, fieldKey, fieldValue));
// 查询数据QueryResultqueryResult=influxDB.query(newQuery("SELECT * FROM cpu_load_short"));
for (QueryResult.Resultresult : queryResult.getResults()) {
for (QueryResult.Seriesseries : result.getSeries()) {
System.out.println("Name: "+series.getName());
System.out.println("Tags: "+series.getTags());
System.out.println("Columns: "+series.getColumns());
System.out.println("Values: "+series.getValues());
            }
        }
// 关闭连接influxDB.close();
    }
}

多维数据库

多维数据库(OLAP数据库)是一种用于在线分析处理(OLAP)的数据库,通常用于处理大量的多维数据(例如数据仓库)。它们与传统的关系型数据库(OLTP数据库)不同,后者通常用于在线事务处理(OLTP)。

存储方式

多维数据库通常采用列存储和基于索引的存储方式,以优化查询性能。它们也通常采用数据压缩技术来减少存储空间的使用。

使用方式

多维数据库通常用于数据分析和决策支持。用户可以通过多维分析工具(例如OLAP分析器)查询和分析多维数据集。多维数据库还支持复杂的分析操作,例如数据切片、数据钻取、数据旋转和数据透视表。

优缺点

优点:

  • 能够处理大量的多维数据,并支持高效的查询和分析操作;
  • 支持多维分析工具,使用户能够更轻松地探索数据集;
  • 支持数据压缩技术,可以减少存储空间的使用。

缺点:

  • 通常需要额外的硬件和软件支持,例如高速存储器和数据分析工具;
  • 查询性能通常较慢,因为多维数据库需要执行大量的聚合操作和数据透视表操作;
  • 数据库设计和维护较为复杂,需要更多的专业知识和技能。

适用场景

多维数据库通常用于数据分析和决策支持,适用于需要处理大量多维数据集的应用程序,例如企业数据分析、销售分析、市场研究等。

代码展示

示例代码使用JDBC API连接SAP HANA数据库,执行SELECT语句并打印结果集中的数据。请将示例代码中的SCHEMA_NAME、USER_NAME、PASSWORD、TABLE_NAME和COLUMN1、COLUMN2等占位符替换为实际的数据库名称、用户名、密码、表名和列名。

importjava.sql.*;
publicclassHanaExample {
publicstaticvoidmain(String[] args) {
Connectionconn=null;
Statementstmt=null;
ResultSetrs=null;
try {
// 注册 JDBC 驱动Class.forName("com.sap.db.jdbc.Driver");
// 打开连接Stringurl="jdbc:sap://localhost:30015/?currentschema=SCHEMA_NAME";
Stringuser="USER_NAME";
Stringpassword="PASSWORD";
conn=DriverManager.getConnection(url, user, password);
// 执行查询stmt=conn.createStatement();
rs=stmt.executeQuery("SELECT * FROM TABLE_NAME");
// 处理结果集while (rs.next()) {
Stringcolumn1=rs.getString("COLUMN1");
intcolumn2=rs.getInt("COLUMN2");
// ...System.out.println(column1+"\t"+column2);
            }
        } catch (SQLExceptionse) {
se.printStackTrace();
        } catch (Exceptione) {
e.printStackTrace();
        } finally {
// 关闭资源try {
if (rs!=null) rs.close();
if (stmt!=null) stmt.close();
if (conn!=null) conn.close();
            } catch (SQLExceptionse) {
se.printStackTrace();
            }
        }
    }
}

关系型数据库和非关系型数据库是按照数据模型分类的两种数据库,关系型数据库以表的形式存储数据,表之间可以建立关系;非关系型数据库则可以采用不同的数据模型存储数据,如键值对、文档型、列族型、图形等,不依赖固定的表格结构,因此非关系型数据库更适用于海量数据存储和分布式环境。

内存数据库则是将数据存储在内存中,提供了快速的数据存储和读取,但容灾和数据一致性需要注意。数据仓库则是一种特殊的数据库,用于支持企业级的数据分析和报表,将数据按照主题维度建立多维数据集,并支持ETL过程和OLAP分析。对象存储是一种将数据存储为对象的数据库,对象可包含任何形式的数据,并以唯一的键标识。

图数据库则是用于存储节点和节点之间的关系,常用于社交网络、知识图谱等场景。时序数据库则是专门用于存储时间序列数据,如物联网数据、日志数据、金融数据等。多维数据库则是用于存储和分析多维数据,将数据存储在立方体结构中,适用于数据挖掘和商业智能等领域。

总的来说,不同类型的数据库适用于不同的数据场景和业务需求。选择适合自己业务场景的数据库类型,能够提高数据的存储效率、读取速度和分析能力。

相关实践学习
AnalyticDB MySQL海量数据秒级分析体验
快速上手AnalyticDB MySQL,玩转SQL开发等功能!本教程介绍如何在AnalyticDB MySQL中,一键加载内置数据集,并基于自动生成的查询脚本,运行复杂查询语句,秒级生成查询结果。
阿里云云原生数据仓库AnalyticDB MySQL版 使用教程
云原生数据仓库AnalyticDB MySQL版是一种支持高并发低延时查询的新一代云原生数据仓库,高度兼容MySQL协议以及SQL:92、SQL:99、SQL:2003标准,可以对海量数据进行即时的多维分析透视和业务探索,快速构建企业云上数据仓库。 了解产品 https://www.aliyun.com/product/ApsaraDB/ads
目录
相关文章
|
存储 缓存 前端开发
详解前端数据存储
详解Cookie, Session, SessionStorage, LocalStorage 引言 在Web开发中,数据的存储和管理是非常重要的。Cookie、Session、SessionStorage和LocalStorage是常见的Web存储解决方案。本文将详细介绍这些概念,比较它们的特点和用法,并提供相关的代码示例。
194 0
|
1月前
|
存储 SQL 分布式计算
数据存储与管理技术有哪些?
数据存储与管理技术有哪些?
77 3
|
6月前
|
存储 小程序
数据存储,详细讲解
数据存储,详细讲解
|
6月前
|
存储 SQL 算法
链表:一种灵活的数据存储方式
链表:一种灵活的数据存储方式
|
7月前
|
存储 对象存储 块存储
高性能数据存储有哪些方式
高性能数据存储有哪些方式
150 0
|
存储 应用服务中间件 nginx
k8s--数据存储、EmptyDir存储
k8s--数据存储、EmptyDir存储
今天来给大家分享一下我学到的关于数据存储的知识
今天来给大家分享一下我学到的关于数据存储的知识
|
存储 编译器 C语言
【学习笔记之我要C】数据存储
【学习笔记之我要C】数据存储
65 0
|
存储 缓存 固态存储
数据存储方式——KVELL:快速持续键值存储的设计与实现
数据存储方式——KVELL:快速持续键值存储的设计与实现
数据存储方式——KVELL:快速持续键值存储的设计与实现