图形数据库与关系数据库:是什么以及为什么?
数据库,是结构化信息(或数据)的有序集合,通常以电子形式存储在计算机系统中。在科技日新月异的现代社会,您可能听说过关系数据库和图形数据库,因为它们非常常见。如果您从未听说过它们,那么请系好安全带,因为您即将了解这两个数据库。
在本文中,我们将探讨图形数据库和关系数据库。这将是对这两个数据库的基本介绍。我们当然会讨论它们的优缺点,以及应该在什么情况下使用哪个数据库。让我们开始吧。
目录
图形数据库
图形数据库是一种以节点和边的形式存储数据的数据库。其数据存储方式非常灵活,无需遵循任何预定义的模型。该图构成了两个节点之间的关系,这种关系可以是有向的,也可以是无向的。这类数据库旨在处理数据/节点之间的复杂关系。
节点用于存储数据。每个节点包含一组属性,这些属性提供有关节点本身的信息。
边(Edge)存储两个节点或实体之间的关系。一条边总是有起始节点和终止节点。
图形数据库如何工作?
与依赖表和列的传统关系数据库不同,图形数据库采用无模式结构。这意味着没有预定义的表或列,数据可以以灵活、可扩展且高效的方式存储。
图形数据库使用各种类型的数据模型,包括属性图和 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)
上述代码创建了一个具有姓名、年龄、位置和兴趣等属性的用户节点,并将其添加到图形数据库中。
推荐引擎
推荐引擎是一种机器学习算法,用于根据用户之前的操作、偏好和行为向用户推荐商品。它们通常用于电子商务网站、流媒体平台和社交媒体网站,为用户提供个性化推荐。
图形数据库可用于推荐引擎,从而更高效地表示和处理数据。图形数据库旨在存储和查询实体之间的关系,这是推荐引擎的一个基本功能。以下是图形数据库在推荐引擎中的应用示例:
假设我们要构建一个电影推荐引擎。我们可以将电影和用户表示为图中的节点,并使用边来表示诸如电影评分和用户偏好之类的关系。
每个电影节点可以包含标题、类型、导演和演员等属性。每个用户节点可以包含年龄、性别和位置等属性。节点之间的边可以表示不同类型的关系。例如,“已观看”边可以将用户节点连接到电影节点,其评分属性表示用户对该电影的评分。
通过使用图数据库,我们可以轻松地查询图谱,为特定用户提供推荐。例如,我们可以找到相似用户评分较高的电影,或者找到与用户评分较高的电影相关的电影。
以下是如何使用 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)
上述代码创建了一个包含标题、类型、导演和演员等属性的电影节点,并使用py2neo
包将其添加到图形数据库中。您可以向同一张图中添加更多节点。
欺诈检测系统
FDS 需要能够通过各种模式识别可疑行为。图形数据库在欺诈检测中非常有用,因为它们可以分析关系并识别出可能存在诈骗的迹象。
下面是 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
此查询的作用是匹配所有在不同商家进行交易的信用卡,并返回信用卡号、商家名称以及该信用卡在该商家的交易次数。这有助于识别诈骗行为。
如何使用图形数据库?
现在您已经了解了什么是图形数据库、它们的工作原理以及何时可以使用它们。现在问题来了:“好吧,这很酷,但我该如何使用它呢?”
使用图形数据库需要遵循几个步骤:
1. 选择图形数据库软件
首先,您需要选择一个特定的图形数据库平台,例如Neo4j、OrientDB、JanusGraph、Arangodb或Amazon Neptune。选择平台后,您就可以使用该平台的查询语言开始处理图形数据。
2. 规划你的图形模型
选择数据库软件后,定义实体及其之间的关系。您可以使用纸笔或图表工具来创建图形模型的可视化表示。
3.创建图形数据库
完成图模型后,在图形数据库软件中创建一个新的数据库实例。根据软件的不同,您可以使用命令行或图形用户界面 (GUI) 来创建新的数据库实例。
4. 定义模式
在向图数据库添加节点和边之前,请先定义架构。架构定义了实体和关系类型、属性及其数据类型。大多数图数据库软件都支持动态架构更新。(我知道我说过“它是一个无架构的结构”,但最好定义一个概览结构)
5.添加节点和边
节点表示图数据库中的实体,边表示实体之间的关系。您可以使用软件的专用语言(例如 Cypher)添加节点和边。
CREATE (user:User {name: 'Jatin'})
CREATE (article:Article {title: 'Graph Databases vs. Relational Databases'})
CREATE (user)-[:WROTE]->(article)
上述代码创建了两个节点,一个带有标签“User”,一个带有标签“Article”,然后使用 WROTE 关系类型在两个节点之间创建关系。
6.查询数据
要查询数据,可以使用MATCH
Cypher 中的子句。例如,要查找 Jatin 撰写的所有文章,可以使用以下代码:
MATCH (user:User {name: 'Jatin'})-[:WROTE]->(article:Article)
RETURN article.title
7.更新数据
要更新数据,可以使用SET
Cypher 中的子句。例如,要将 ID 为 47 的文章标题更新为“图形数据库”,可以使用以下代码:
MATCH (article:Article {id: 47})
SET article.title = 'Graph Databases'
8.删除数据
要删除数据,可以使用DELETE
Cypher 中的子句。例如,要删除具有 id 的文章节点47
以及与该节点相关的任何关系,可以使用以下代码:
MATCH (article:Article {id: 47})
DETACH DELETE article
此代码首先匹配文章节点,然后在删除节点本身之前分离与该节点连接的任何关系。
优点
-
它们能够非常灵活地处理复杂的数据和关系。
-
他们使用图形遍历来浏览大量相互连接的数据。
-
它们还可以水平扩展,这意味着添加更多机器来处理越来越多的数据。
-
图形数据库可以对大数据或小数据进行实时更新,同时支持查询。
缺点
-
对于整齐地放入表格和行中的结构化数据,它们可能不那么有效。
-
它们比关系数据库更复杂,可能需要更多的知识。
关系数据库
关系数据库是信息的集合,它以预定义的关系组织数据,数据存储在一个或多个包含行和列的表(或“关系”)中。这些表通过一组称为外键的键相互关联,外键定义了数据之间的关系。
行代表表中的记录。并具有唯一键。
表的列保存数据的属性,每条记录通常对每个属性都有一个值。
何时使用关系数据库?
对于需要以有组织、可控的方式存储数据并通过复杂查询访问的情况,关系数据库是理想之选。然而,在某些情况下,其他数据库解决方案可能更合适:
存储结构化数据
当您有大量数据需要按逻辑顺序组织时,关系数据库是一个不错的选择。您可以用清晰的架构定义表,并强制数据之间的关系。
确保数据完整性
关系数据库具有内置机制来确保数据的完整性。通过定义表之间的关系,您可以强制执行约束,以保持数据的整洁和一致性。
执行复杂查询
结构化查询语言 (SQL) 提供了一种强大的语言来处理关系数据库中的数据。使用 SQL,您可以以各种方式检索、过滤、排序和聚合数据。
水平缩放
关系数据库可以水平扩展,这意味着您可以将表分布到多台服务器上。这在处理单台服务器无法容纳的大型数据集时尤其有用。
关系数据库如何工作?
正如我已经提到的,它们以行和列的形式工作,形成一个表格。这种结构化的格式使得搜索和检索特定数据变得容易,并且允许执行更复杂的数据查询。
假设我们有一个销售产品的电商网站。我们需要存储关于产品、客户以及他们下达的订单的信息。我们可以创建一个关系数据库来存储这些信息,如下所示:
-
表:我们将创建三个表 -
products
、customers
和orders
。每个表都有自己唯一的名称,并包含一组行(记录)和列(字段)。 -
主键:每个表都需要一个主键来唯一地标识表中的每一行。例如,在
products
表中,我们有product_id
。在customers
表中,我们有。customer_id
在orders
表中,我们有。order_id
作为主键。 -
外键:关系数据库使用外键来建立表之间的关系。外键是指一个表中与另一个表的主键匹配的列,从而在两个表之间建立关系。例如,在
orders
表中,我们可以有一列customer_id
引用另一个表customer_id
中的列customers
。这在“客户”表和“订单”表之间建立了一对多关系customers
,其中每个客户可以有多个订单。 -
SQL:我们可以使用 SQL 来创建和管理数据库。以下是创建“products”表的 SQL 语句示例:
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(255),
price DECIMAL(10,2)
);
这将创建一个名为“products”的表,其中包含三列 - product_id
、product_name
和price
。该product_id
列是主键。
如何使用关系数据库?
要使用关系数据库,您需要遵循以下步骤:
1.创建数据库
首先,您需要创建一个新的数据库来存储表和数据。这通常可以使用数据库管理工具(例如MySQL、PostgreSQL或Microsoft SQL Server )来完成。您需要为数据库选择一个名称并配置所有必要的设置。
2. 设计你的架构
这是最重要的一步,因为关系数据库遵循模式方法,所以我们需要创建一个模式。因此,您需要为数据库设计模式。这涉及创建表并指定每个表的列和数据类型。您还需要使用主键和外键定义表之间的关系。
3. 填充数据库
设计好架构后,您就可以开始向表中添加数据了。您可以使用 SQL 命令直接将数据插入数据库,也可以使用图形界面手动添加数据。
4.查询数据库
添加数据后,您可以开始对数据库运行查询,以检索特定数据或执行计算。您可以使用 SQL 命令或查询构建器工具来完成此操作。
让我们以旧的产品示例为例,products
使用 SQL 对表执行一些查询:
创建新记录:
INSERT INTO products (product_id, product_name, price) VALUES (1, 'Product 1', 9.99);
此 SQL 语句将新记录插入到products
表中,其值为product_id
、product_name
和price
列。
读取数据:
SELECT * FROM products;
此 SQL 语句从表中检索所有记录products
。我们还可以指定条件来检索特定记录。例如,要检索价格小于 10 的产品:
SELECT * FROM products WHERE price < 10;
更新数据:
UPDATE products SET price = 8.99 WHERE product_id = 1;
此 SQL 语句将记录的“价格”列从product_id
1 更新为 8.99。
删除数据:
DELETE FROM products WHERE product_id = 1;
此 SQL 语句从“products”表中删除“product_id”为 1 的记录。
现在,在你走之前
让我向您展示我们在之前的示例中可以执行的一些复杂查询:
场景 1:
我们希望找出订单金额最高的前 5 位客户,并显示他们的订单详情。查询语句如下:
SELECT
customers.customer_name,
orders.order_date,
products.product_name,
order_items.quantity,
products.price * order_items.quantity AS order_total
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
JOIN order_items ON orders.order_id = order_items.order_id
JOIN products ON order_items.product_id = products.product_id
GROUP BY customers.customer_id
ORDER BY SUM(products.price * order_items.quantity) DESC
LIMIT 5;
场景 2:
查找过去一个月下的所有订单,并显示客户姓名、电子邮件地址和订单详细信息。
SELECT
customers.customer_name,
customers.email,
orders.order_id,
orders.order_date,
products.product_name,
order_items.quantity,
products.price * order_items.quantity AS order_total
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
JOIN order_items ON orders.order_id = order_items.order_id
JOIN products ON order_items.product_id = products.product_id
WHERE orders.order_date >= DATEADD(month, -1, GETDATE())
ORDER BY orders.order_date DESC;
优点
-
关系数据库已被广泛理解并已使用了数十年,因此拥有大量的专业知识。
-
它们高度结构化并允许使用 SQL 高效查询数据。
-
关系数据库可以垂直扩展,这意味着在单台机器上添加更多资源以提高性能。
-
用户可以在几秒钟内轻松访问/检索所需信息,而无需担心数据库的复杂性
缺点
-
维护大量数据可能会变得困难。
-
它们不太适合处理具有复杂关系或图形结构的数据。
-
关系数据库由行和列组成,需要大量的物理内存。
总结
在本文中,我解释了图数据库和关系数据库,以及它们的优缺点。最后,我想说,图数据库和关系数据库的用途不同,各有优缺点。图数据库特别适合涉及复杂关系且需要快速查询大量数据的用例。另一方面,关系数据库擅长处理需要高效存储、搜索和检索的结构化数据。
在图形数据库和关系数据库之间进行选择取决于您的应用程序的具体需求。如果您的数据具有明确定义的模式,则选择关系数据库。如果您的数据具有复杂的关系,则选择图形数据库。
如果您想了解更多关于这些或其他主题的解释,请在评论区告诉我。别忘了点赞这篇文章。我们下篇文章再见。同时,您可以在这里关注我:
文章来源:https://dev.to/documatic/graph-databases-vs-relational-databases-what-and-why-5d6g