如何将数据从MongoDB迁移到MySQL?

15

我目前正在开发一个类似于分析的应用程序,它包含一个AngularJS应用程序,该应用程序与Spring REST客户端应用程序通信,用户从其中创建令牌(跟踪ID),并使用生成的脚本和此ID将其放在其网站上,以收集关于访问者活动的信息,通过另一个Spring REST跟踪应用程序。对于跟踪应用程序,我使用mongodb来收集访问者活动/访问者信息以实现快速插入,但对于REST客户端应用程序,则使用mysql来存储用户/帐户详细信息。

我的问题是如何将跟踪应用程序中的mongo数据迁移到mysql中,以便从AngularJS客户端应用程序轻松且最快地分析具有任何类型过滤器的数据。是否需要手动创建任何工作人员,以定期从最后一个点转移数据到mongo到mysql的当前状态,或者是否存在可以设置这种转移的现有工具?

4个回答

24

目前没有官方库可以实现此功能。

但是你可以利用mongoDB的mongoexport特性将它以CSV格式导出并使用mysqlimport导入到MySQL中。

以下是文档链接:MySQL 导入MongoDB 导出


还有一个方法是编写一个程序,使用你最喜欢的编程语言从MongoDB中读取数据并将其写入MySQL中。


1
然而,这种方法不考虑嵌套文档。 - Michael
1
@Michael,嵌套文档应该放在表格中的哪个位置并不是通用的,最好使用我提到的第二种方法编写程序来完成这项工作,您可以指定将MongoDB字段映射到MySQL字段。 - Sumit

9
MySQL 5.7有一种新的JSON数据类型,非常方便。
您可以在MySQL中创建一个表来接收原始的JSON消息,然后使用SQL查询它或进行后处理,将数据加载到结构化的数据库表集合中。
查看这个:https://dev.mysql.com/doc/refman/5.7/en/json.html

6
我意识到这个问题已经几年了 - 但最近有很多人询问是否可以使用我开发的工具(https://virtual.blue/apps/json-converter)来实现 OP 所要求的功能(将 MongoDB 转换为 SQL),所以我猜这仍然是人们想要的。继续阅读,了解为什么我对此并不感到惊讶。
简短回答是:这个工具能否帮助你,或许吧。如果你的现有数据关系不太复杂,并且你的数据库不是特别大,那么它可能值得一试。
然而,我认为试图解释这种转换的问题可能会有所帮助,因为到目前为止,所有我看到的答案都是“尝试工具 X”或“先将其转换为格式 Y,然后使用实用程序 Z 将其导入 MySQL”。即没有考虑到在这样做之后得到的结果是否在数据关系和完整性方面是有意义的。
例如,您可以将整个数据库转储放入单个SQL表的单个字段中(实际上可能由于空间限制而无法实现,但希望您明白我的意思)。然后您的数据库将是“MySQL格式”,但对任何人都没有任何用处。
关键是,您实际上想要的是一个完全定义的数据库模型,正确地封装了所有固有数据关系(正如所知的“数据库规范化”)。如果您的转换过程错误地处理了这些关系,则会产生损坏的模型,并且您尝试运行的任何查询都可能返回无意义的结果。不幸的是,没有什么神奇的工具会“知道”在MySQL中表示数据的最佳方法,闭上眼睛并将其推到一堆随机工具中,不太可能奇迹般地获得您想要的结果。
在“NoSQL”哲学(潮流)中存在一个根本性问题,他们向人们推销了“非关系型数据”的虚假概念。当我第一次听到这个时,我的第一个想法是,“那怎么行?毕竟所有的数据都是有关系的吧?”从事实来看,我们正在逐渐获得越来越多的证据证明我的直觉是正确的。(“NoSQL?为什么要停在那里?我选择‘NoDatabase’。它完全没有返回结果,但速度确实很快!”)
NoSQL的疯狂将几个重要的基本工程原则抛到了一边。我们大声呼喊着“不要硬编码!”,“DRY!”(不要重复自己),因为这些行动会给系统带来缺乏灵活性的影响。传统智慧在建议“创建一个完整描述所有数据关系的模型”时,正是出于同样的灵活性论点。然后你可以对其执行任意查询并期望得到有意义的结果。“是的,但有一堆查询我们永远不需要运行,”NoSQL支持者说。但我们肯定已经从“我们永远不需要做的事情”中吸取了教训吧?(“我大量使用硬编码,因为我知道我永远不想改变我的代码。”嗯...)
关于速度的争论在很大程度上是无意义的。假设您经常执行复杂的9个表连接操作,性能会相对较差。因此,创建一个索引并将其缓存起来,用一些磁盘空间换取速度。NoSQL的哲学是为了速度而交换数据完整性,这完全没有任何意义。
当您生成快速查找索引(缓存/表/映射等)时,实际上是在创建模型上的视图。如果您的模型发生更改,您可以轻松地更新视图。从模型到视图很容易-它是一对多的操作,您处于熵的正确侧面。
然而,当您选择MongoDB时,您实际上决定创建视图,而不必描述您的基本模型。现在您发现有一些查询想要运行,但无法运行-因此,您想要转移到SQL并正确地对数据进行建模。问题是,现在您想要从视图转移到模型。现在你处于熵的错误侧面。您的视图是模型基本关系的有损表示。您不能指望工具“翻译”您的数据库,因为您要求它插入最初未定义的新关系。这些是现实世界中不可机器猜测的关系。工具无法知道原本旨在建立哪些关系。
简而言之,唯一可靠的方法是亲自动手。一个理解你正在建模的系统的聪明人需要坐下来仔细地编写(可能是大量的)代码,有效地遍历数据并解决所有不足表示的数据关系。如果你的数据很复杂,那么这将会是一件头痛的事情,没有捷径可走。
如果你的数据仍然相对简单,我建议尽快进行转换,以免变得困难。在这种情况下,我的工具(https://virtual.blue/apps/json-converter)可能能够提供帮助。
(在提出所有这些胡说八道之前,他们真的应该先问问物理学家……!)

很高兴知道我不是唯一一个和你想法相同的人。我正在研究你所描述的确切概念。一开始我以为这没问题,但现在我深陷泥潭。对我来说,规范化并不容易理解。当我开始阅读有关NoSQL的内容时,我感到困惑。然后我开始看到奇怪的事情。找到我几年前在Facebook上发布的东西需要我滚动页面。我不能直接搜索。但文本文件加载速度非常快。JSON不就是一个文本文件吗? - user2860594
就像你读了我的心思,经历了我所经历的一切。感谢您的评论。NoSQL对于除了最基本的玩具应用程序或极其简单的数据模型之外的任何东西都是一个陷阱。然而,极其简单的数据模型确实很常见,在这些情况下,NoSQL的速度可能会胜出...但我实际上并没有在现实生活中看到很多这样的实际用例,相比于NoSQL周围的炒作,它从来没有真正增加过,这必须让您考虑是技术令人惊叹,还是营销。 - Michael Peterson

1

您可以下载Mongo的Studio 3T试用版,并直接将数据库导出为SQL(或JSON)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接