发布于 2026-01-05 3 阅读
0

NoSQL数据库与图数据库:你应该使用哪一个?

NoSQL数据库与图数据库:你应该使用哪一个?

如今,我们拥有各种各样的数据库,旨在满足我们特定的数据需求。虽然传统的关系型数据库仍然被广泛使用,但 NoSQL 数据库的灵活性和可扩展性使其日益流行。这些数据库种类繁多,包括文档型数据库、键值存储和列族存储。在 NoSQL 数据库中,图数据库的受欢迎程度正在迅速提升。本博客将深入探讨图数据库与其他 NoSQL 数据库之间的区别,并分析它们的工作原理。此外,我们还将讨论图数据库和 NoSQL 数据库的应用案例,帮助您更好地了解哪种数据库类型最适合您的项目。

目录

NoSQL数据库

NoSQL 数据库是一种非关系型数据库,它不使用结构化查询语言 (SQL) 进行数据操作,而是使用其他数据模型进行数据访问和存储。SQL 数据库通常用于处理结构化数据,但对于处理非结构化或半结构化数据,它们可能并非最佳选择。

NoSQL 数据库能够快速高效地存储和检索海量数据。它们支持多种数据类型,例如层级数据、文档、图和键值对。文档数据库和键值存储是 NoSQL 数据库的常见示例。

NoSQL数据库的基础知识——以及我们为什么需要它们

何时使用 NoSQL 数据库?

NoSQL 数据库适用于传统 SQL 数据库可能无法胜任的特定应用场景。以下列举了一些 NoSQL 数据库能够带来优势的情况:

处理大规模数据

NoSQL 数据库最适合处理大规模的非结构化或半结构化数据。这类数据可能不遵循严格的格式,例如社交媒体帖子、用户生成的内容、物联网设备数据或机器日志。NoSQL 数据库旨在处理海量数据,并且具有高度可扩展性。

高可扩展性

当您需要处理成千上万个并发连接,或者需要处理和存储快速流动和变化的数据时,NoSQL 数据库表现出色。它们提供自动分片、复制和其他功能,有助于跨数百或数千台通用服务器进行横向扩展。

数据模式变更的灵活性

NoSQL 数据库具有高度的灵活性,能够适应数据模式的变化,因为它们不强制执行传统关系数据库所规定的数据一致性规则。这意味着,与 SQL 数据库相比,在 NoSQL 数据库中更新数据模型或添加新字段要容易得多。因此,对于需要快速调整数据模型以适应新型数据或不断变化的业务需求的企业而言,NoSQL 数据库是一个绝佳的选择。

经济高效的规模化

使用 NoSQL 数据库的另一个重要原因是节省扩展成本。由于 NoSQL 数据库可以跨多个通用服务器进行水平扩展,因此通常比需要垂直扩展(即购买更强大的硬件)的传统 SQL 数据库更具成本效益。随着数据量的增长,您可以轻松地向 NoSQL 集群添加更多服务器以满足需求。

NoSQL数据库是如何工作的?

NoSQL数据库,也称为NoSQL数据库,non-relational databases旨在处理大量非结构化或半结构化数据。“NoSQL”一词代表“不仅仅是SQL”,指的是NoSQL数据库并不局限于传统关系数据库使用的结构化查询语言(SQL)。

NoSQL 数据库使用多种数据模型来存储和访问数据。一些常见的数据模型包括:

  1. 文档数据库:以半结构化文档的形式存储数据,通常采用 JSON 或 XML 格式。MongoDB 和 Couchbase 就是文档数据库的例子。

  2. 键值数据库:将数据存储为键值对的集合,其中键是数据的唯一标识符。Riak 和 Redis 就是键值数据库的例子。

  3. 列族数据库:以列族的形式存储数据,每个列族包含一组相关的列。Apache Cassandra 和 HBase 就是列族数据库的例子。

  4. 图数据库:以节点和边的形式存储数据,其中节点代表实体,边代表实体之间的关系。Neo4j 和 OrientDB 就是图数据库的例子。

NoSQL数据库具有高度可扩展性,能够跨多个服务器处理大量数据。它们常用于大数据应用中,用于存储和处理大量非结构化数据,例如社交媒体动态、用户生成内容和点击流数据。

如何使用NoSQL数据库?

要在代码中使用 NoSQL 数据库,首先需要选择一个符合您需求的 NoSQL 数据库。一些流行的 NoSQL 数据库包括MongoDBCassandraRedisDynamoDB。每个数据库都有自己的一套 API 和驱动程序,可用于与其交互。本文将以 MongoDB 为例,解释如何使用 Python 及其PyMongo相关包执行 CRUD 操作。

设置 MongoDB

首先,您需要在系统上安装 MongoDB。您可以参考MongoDB 官方文档获取安装说明。

安装完 MongoDB 后,您可以在终端中运行以下命令来启动它:

mongod
Enter fullscreen mode Exit fullscreen mode

使用 Python 连接到 MongoDB

接下来,你需要安装pymongoMongoDB 的官方 Python 客户端库。你可以使用 pip 进行安装:

pip install pymongo
Enter fullscreen mode Exit fullscreen mode

安装完成后pymongo,您可以使用以下代码连接到您的 MongoDB 实例:

import pymongo

# Create a MongoClient 
client = pymongo.MongoClient("mongodb://localhost:27017/")

# Create a database 
db = client["your_datebase_name"]
Enter fullscreen mode Exit fullscreen mode

这段代码创建了一个MongoClient对象,该对象代表系统上的 MongoDB 实例,以及一个MongoDatabase对象,该对象代表该实例中的一个数据库。

创建集合和插入文档

连接到数据库后,您可以使用以下代码在该数据库中创建集合:

# Create a collection 
collection = db["mycollection"]
Enter fullscreen mode Exit fullscreen mode

这段代码创建了一个MongoCollection对象,该对象代表数据库中的一个集合。然后,您可以使用此对象通过 `insert`insert_one或 `insert`insert_many方法将文档插入到该集合中:

# Insert a single document
document = {"name": "John", "age": 30}
result = collection.insert_one(document)
print(result.inserted_id)

# Insert multiple documents
documents = [
    {"name": "Alice", "age": 25},
    {"name": "Bob", "age": 35},
    {"name": "Charlie", "age": 45}
]
result = collection.insert_many(documents)
print(result.inserted_ids)
Enter fullscreen mode Exit fullscreen mode

insert_one方法将单个文档插入集合,并返回一个InsertOneResult包含操作信息的对象。inserted_id该对象的属性包含_id插入文档的 ID。

insert_many方法将多个文档插入集合中,并返回一个InsertManyResult包含操作信息的对象。该对象的属性包含一个已插入文档的值inserted_ids列表。_id

阅读馆藏文献

要从集合中检索一个或多个文档,可以使用以下find方法:

# Find a single document
query = {"name": "John"}
document = collection.find_one(query)
print(document)

# Find multiple documents
query = {"age": {"$gt": 30}}
documents = collection.find(query)
for document in documents:
    print(document)
Enter fullscreen mode Exit fullscreen mode

find_one方法从集合中检索与查询匹配的单个文档,并返回dict表示该文档的对象。

find方法从集合中检索与查询匹配的多个文档,并返回一个Cursor可用于遍历这些文档的对象。query参数是一个dict指定查询条件的对象。在第二个示例中,查询检索字段age值大于 30 的所有文档。

更新集合中的文档

要更新集合中的一个或多个文档,可以使用update_one以下update_many方法:

# Update a single document
query = {"name": "John"}
new_value = {"$set": {"age": 32}}
result = collection.update_one(query, new_value)
print(result.modified_count)

# Update multiple documents
query = {"age": {"$lt": 30}}
new_value = {"$inc": {"age": 1}}
result = collection.update_many(query, new_value)
print(result.modified_count)
Enter fullscreen mode Exit fullscreen mode

第一个示例使用该update_one方法更新集合中与查询匹配的单个文档。query参数指定选择要更新的文档的条件,new_value参数指定要对文档进行的更改。这里,运算$set符用于将age字段设置为 32。

第二个示例使用该update_many方法更新集合中与查询匹配的多个文档。在本例中,$lt首先使用运算符选择age字段值小于 30 的文档,然后$inc使用运算符将​​该age字段值加 1。

从集合中删除文档

要从集合中删除一个或多个文档,可以使用delete_one以下delete_many方法:

# Delete a single document
query = {"name": "John"}
result = collection.delete_one(query)
print(result.deleted_count)

# Delete multiple documents
query = {"age": {"$gt": 40}}
result = collection.delete_many(query)
print(result.deleted_count)
Enter fullscreen mode Exit fullscreen mode

第一个示例使用该delete_one方法从集合中删除与查询匹配的单个文档。该方法返回的对象deleted_count的属性DeleteResult指示已删除的文档数量。

第二个示例使用该delete_many方法从集合中删除与查询匹配的多个文档。这里,$gt运算符用于选择age字段值大于 40 的文档。

优点

  • NoSQL 数据库具有高度可扩展性,旨在处理大量数据和复杂查询。

  • 它们提供了一种灵活的数据模型,可以轻松地添加或删除字段,而无需更改数据库架构。

  • NoSQL 数据库能够处理大量事务,并且读写速度比关系型数据库更快。

  • 由于它们可以在低成本的通用硬件上运行,因此运行成本通常比关系型数据库低。

缺点:

  • NoSQL 数据库可能不提供连接或 ACID 事务等功能,这对于某些使用场景来说可能是一个问题。

  • 与关系型数据库不同,NoSQL 数据库没有定义完善的标准,这可能会导致数据一致性和可移植性方面的问题。

  • 与 SQL 数据库相比,NoSQL 数据库的开发者和用户群体较小,这意味着可用的资源和支持也较少。

  • 由于其设计和使用场景不同,NoSQL 数据库的学习曲线更为陡峭,需要专门的技能才能有效操作。

图数据库

图数据库是一种以节点和边的形式存储数据的数据库。数据存储方式非常灵活,无需遵循预定义的模型。这种图在两个节点之间建立关系,这种关系可以是定向的,也可以是无向的。这类数据库旨在处理数据/节点之间复杂的关联关系。

节点用于存储数据。每个节点包含一组属性,这些属性提供有关节点自身的信息。

用于存储两个节点或实体之间的关系。一条边始终包含一个起始节点和一个终止节点。

什么是图数据库? - 开发者指南

图数据库是如何工作的?

与依赖表和列的传统关系型数据库不同,图数据库采用无模式结构。这意味着没有预定义的表或列,数据可以以灵活、可扩展和高效的方式存储。

图数据库使用多种数据模型,包括属性图和RDF(资源描述框架)图。在属性图中,每个节点和边都可以有多个属性,这些属性是键值对,用于描述节点或边的特性。在RDF图中,节点和边用URI(统一资源标识符)表示,实体之间的关系用三元组(主语、谓语、宾语)表示。

图数据库通常使用查询语言(例如 Cypher 或 Gremlin)来遍历图、查询数据和更新数据。这些查询语言的设计旨在方便用户使用,使工程师能够轻松地使用图数据库。

何时使用图数据库?

图数据库用于处理复杂数据。它们对于需要对实体间关系进行建模和查询的应用尤其有用,例如社交网络、推荐引擎和欺诈检测系统。

社交网络

众所周知,社交网络极其复杂且高度互联,其数据结构也十分复杂。它们记录着用户帖子、评论和其他实体之间的关系。图数据库使用户能够轻松遍历图结构,并发现实体之间的关联。

以下是一个如何在社交网络中使用图数据库的示例:

from py2neo import Graph, Node

# set up graph connection
graph = Graph()

# create user node with attributes
user = Node("User", name="John Doe", age=25, location="New York", interests=["programming", "video games"])

# add user node to graph
graph.create(user)
Enter fullscreen mode Exit fullscreen mode

上述代码创建了一个用户节点,该节点具有姓名、年龄、位置和兴趣等属性,并将其添加到图数据库中。

推荐引擎

推荐引擎是一种机器学习算法,它根据用户之前的操作、偏好和行为向用户推荐商品。推荐引擎通常应用于电子商务网站、流媒体平台和社交媒体网站,为用户提供个性化推荐。

图数据库可用于推荐引擎,以更高效、更有效地表示和处理数据。图数据库旨在存储和查询实体之间的关系,这是推荐引擎的一个基本方面。以下是一个图数据库在推荐引擎中的应用示例:

假设我们要构建一个电影推荐引擎。我们可以将电影和用户表示为图中的节点,并使用边来表示诸如电影评分和用户偏好之类的关系。

每个电影节点可以包含标题、类型、导演和演员等属性。每个用户节点可以包含年龄、性别和所在地等属性。节点之间的边可以表示不同类型的关系。例如,“已观看”边可以将用户节点连接到电影节点,其评分属性表示用户对电影的评分。

通过使用图数据库,我们可以轻松查询图谱,从而为特定用户提供推荐。例如,我们可以找到与该用户评分相似的其他用户评价很高的电影,或者找到与该用户评价很高的电影相关的其他电影。

以下是如何使用 Python 包向图数据库添加电影节点的示例py2neo

from py2neo import Graph, Node

# set up graph connection
graph = Graph()

# create movie node with attributes
movie = Node("Movie", title="The Matrix", genre="Science Fiction", director="Lana Wachowski", actors=["Keanu Reeves", "Carrie-Anne Moss"])

# add movie node to graph
graph.create(movie)
Enter fullscreen mode Exit fullscreen mode

以上代码创建了一个电影节点,包含标题、类型、导演和演员等属性,并使用该py2neo软件包将其添加到图数据库中。您可以向同一个图中添加更多节点。

欺诈检测系统

欺诈检测系统需要具备通过各种模式识别可疑行为的能力。图数据库在欺诈检测中非常有用,因为它们可以分析关系并识别可能表明存在诈骗的因素。

以下是一个使用 Cypher 编写的示例,用于检索涉及同一张信用卡在不同商家的所有交易:

MATCH (c:CreditCard)-[:USED_FOR]->(t:Transaction)-[:AT_MERCHANT]->(m:Merchant)
WITH c, m, COUNT(t) AS tx_count
WHERE tx_count > 1
RETURN c.number, m.name, tx_count
Enter fullscreen mode Exit fullscreen mode

这条查询语句的作用是匹配所有在不同商户进行交易的信用卡,并返回信用卡号、商户名称以及该信用卡在该商户的交易笔数。这有助于识别诈骗行为。

如何使用图数据库?

现在您了解了图数据库是什么、它的工作原理以及何时可以使用它。现在问题来了:“好的,这很酷,但我该如何使用它呢?” 使用图数据库需要遵循以下几个步骤:

选择一款图数据库软件

首先,您需要选择一个特定的图数据库平台,例如Neo4jOrientDBJanusGraphArangoDBAmazon Neptune。选择平台后,您就可以使用该平台的查询语言开始处理图数据了。

规划你的图模型

选择好数据库软件后,需要定义实体及其之间的关系。您可以使用纸笔或绘图工具来创建图模型的可视化表示。

创建图数据库

图模型完成后,在图数据库软件中创建一个新的数据库实例。根据软件的不同,您可以使用命令行或图形用户界面 (GUI) 来创建新的数据库实例。

定义模式

在向图数据库添加节点和边之前,请先定义模式。模式定义了实体和关系类型、属性及其数据类型。大多数图数据库软件都支持动态模式更新。(我知道我之前说过“这是一个无模式结构”,但最好还是先定义一个概览结构。)

添加节点和边

节点代表图数据库中的实体,边代表实体之间的关系。您可以使用软件的特定语言(例如 Cypher)添加节点和边。

CREATE (user:User {name: 'Jatin'})
CREATE (article:Article {title: 'Graph Databases vs. Relational Databases'})
CREATE (user)-[:WROTE]->(article)
Enter fullscreen mode Exit fullscreen mode

上面的代码创建了两个节点,一个带有标签“用户”,另一个带有标签“文章”,然后使用 WROTE 关系类型在这两个节点之间创建关系。

查询数据

在 Cypher 中,可以使用MATCH`SELECT` 子句来查询数据。例如,要查找 Jatin 撰写的所有文章,可以使用以下代码:

MATCH (user:User {name: 'Jatin'})-[:WROTE]->(article:Article)
RETURN article.title
Enter fullscreen mode Exit fullscreen mode

更新数据

要更新数据,可以使用SETCypher 中的子句。例如,要将 ID 为 47 的文章标题更新为“图数据库”,可以使用以下代码:

MATCH (article:Article {id: 47})
SET article.title = 'Graph Databases'
Enter fullscreen mode Exit fullscreen mode

删除数据

要删除数据,可以使用DELETECypher 中的 `--delete` 子句。例如,要删除具有指定 ID 的文章节点47及其所有关联关系,可以使用以下代码:

MATCH (article:Article {id: 47})
DETACH DELETE article
Enter fullscreen mode Exit fullscreen mode

这段代码首先匹配文章节点,然后断开与该节点连接的所有关系,最后删除该节点本身。

优点

  • 它们非常灵活,能够处理复杂的数据和关系。

  • 他们使用图遍历来浏览大量相互关联的数据。

  • 它们还可以进行横向扩展,这意味着可以添加更多机器来处理不断增长的数据量。

  • 图数据库可以对大数据或小数据进行实时更新,同时支持查询。

缺点

  • 对于结构化数据(可以整齐地放入表格和行中),它​​们可能效率不高。

  • 它们比关系型数据库更复杂,可能需要更多的专业知识。

总结

NoSQL 数据库和图数据库各有优缺点,选择使用哪一个取决于应用程序的具体要求。

NoSQL 数据库非常适合需要高可扩展性和高性能且处理海量数据的应用。它们能够很好地处理易于分区、分布式和复制的结构化和半结构化数据。NoSQL 数据库的例子包括 MongoDB、Cassandra 和 DynamoDB 等。

另一方面,图数据库非常适合需要复杂且高度关联数据结构的应用,例如社交网络、推荐引擎和欺诈检测系统。它们也能很好地处理任何具有复杂且相互关联关系的数据集。图数据库的例子包括 Neo4j、OrientDB 和 ArangoDB 等。

总之,NoSQL数据库和图数据库各有其用武之地。选择最适合应用程序需求的数据库类型至关重要,这需要考虑数据的结构和复杂性、所需的性能和可扩展性,以及成本和易用性等其他因素。

如果你想了解更多相关内容或其他主题,请在评论区留言。别忘了给文章点赞❤️哦!我们下期再见!同时,你也可以在这里关注我:

图片描述

您或许对以下内容感兴趣

文章来源:https://dev.to/documatic/nosql-databases-vs-graph-databases-which-one-should-you-use-4jpg