第 2 章 导入(更多)数据 导入(更多)数据
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
您和您在 ElectricHarmony 的团队现在面临的挑战是导入大量数据--这些数据将更好地代表您的全部用户群--为用户提供推荐。
您尝试了在第 1 章中使用的数据导入方法,但事实证明,当轨道数据集从十万行增加到一百万行时,导入速度很慢。这往往会导致可怕的 "死亡之轮",让你怀疑自己选择的数据库是否能有效扩展。
您的担心是有道理的。您需要回答团队和利益相关者提出的关键问题,如
-
系统获取数据的速度能否与企业生产数据的速度一样快?
-
系统能否近乎实时地提供建议并跟上其他系统产生的数据?
-
如果发生灾难,恢复需要多长时间?
本章将向您展示如何获取回答这些问题所需的大型数据集。
您的旅程将从简单易懂的数据库管理系统内部介绍开始,包括事务和内存管理。接下来,您将学习如何优化第 1 章中使用的LOAD CSV 命令。然后,您将进入更类似于生产的场景,使用您喜欢的编程语言的自动程序导入数据。您还将尝试使用不同的锁定策略,以了解并行数据导入何时以及如何可行且不会产生负面影响,最后还将学习离线数据导入策略。
数据库事务
事务将一系列操作组合成一个单元,要么完全成功,要么完全失败,从而确保数据完整性。数据库约束(如唯一性和类型约束)强制执行规则,以保持一致性和准确性。事务可确保所有操作都遵守这些约束,但许多检查(如唯一性)通常会推迟到事务结束时(提交时)进行。这就为更新提供了灵活性,比如在数据从一个状态过渡到另一个状态时暂时违反约束。如果任何操作违反了约束,整个事务就会失败并回滚,从而确保不会应用部分更改,并防止数据不一致。
正如你在第 1 章中看到的,你已经有了一些使用数据库约束的经验。例如,你创建了一个约束来确保HAS_TRACK 关系的position 属性是整数:
CREATE CONSTRAINT has_track_position_integer FOR ()-[r:HAS_TRACK]-() REQUIRE r.position IS TYPED INTEGER
如果尝试写入一些不符合已定义约束的数据,比如下面的 Cypher 查询,会发生什么情况?
CREATE (n:Playlist)-[:HAS_TRACK {position: 'some string'}]->(track);
这不会起作用,而是会显示图 2-1所示的错误信息。用数据库术语来说,由于违反了约束,你的事务被中止了。
图 2-1. 尝试执行不符合数据库约束的查询时产生的错误信息
但等等,你甚至都没使用事务这个词--事实上,到目前为止,你在任何地方都没看到过这个词!Neo4j浏览器隐式地使用事务,而且大多数Neo4j驱动程序都提供了一些方法,在这些方法中,你不一定需要担心自己管理事务。只需知道,Neo4j 中的一切都是事务性的。
那么,在引擎盖下到底发生了什么呢?执行这一系列步骤:
-
Neo4j 服务器会打开一个事务。
-
它在数据库上执行更改(如创建数据)。
-
它提交事务(应用更改)或拒绝事务(丢弃更改)。
这一连串的步骤遵守了数据库系统(包括关系型和非关系型)中事务为实现安全性所必需的特性。这些特性通常被命名为 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access