【问题标题】:Importing .JSON into MySQL将 .JSON 导入 MySQL
【发布时间】:2016-10-22 04:07:19
【问题描述】:

我有一个非常大(200k+ 行)和某种复杂的 .JSON 文件,我需要存储在 MySQL 中以便查询它。

这个 .JSON 分为两个主要部分,“边”和“节点”,下面是两者的示例:

{
    "edges": [
        {
            "source": "279364692",
            "target": "282656527",
            "id": "2959",
            "attributes": {
                "Weight": "1.0"
            },
            "color": "rgb(184,178,213)",
            "size": 1.0
        },
        {
            "source": "279364426",
            "target": "3088727691",
            "id": "2122",
            "attributes": {
                "Weight": "1.0"
            },
            "color": "rgb(182,131,187)",
            "size": 1.0
        },
    ],

"nodes": [
    {
        "x": -1281.15625,
        "y": 173.54820251464844,
        "id": "2705660357",
        "attributes": {},
        "color": "rgb(237,248,251)",
        "size": 10.0
    },
    {
        "x": -269.597900390625,
        "y": 1419.9178466796875,
        "id": "3341801730",
        "attributes": {},
        "color": "rgb(237,248,251)",
        "size": 10.0
    }
]
}

我的整个 .JSON 文件的格式与此完全相同,所有内容都在“边缘”和“节点”下。有几个关于如何导入 .JSON 文件的教程,我已经尝试了其中的大部分。但是我还没有找到可以像我这样处理数据的东西。

那么,如何将这些信息存储在 MySQL 数据库中?

【问题讨论】:

  • 您遇到了什么具体错误?你的具体架构是什么?
  • 我在几个不同的实现中遇到了几个错误,我忽略了具体的模式,因为我认为它会导致更多的混乱而不是帮助。简而言之,我正在使用 Gephi 创建一个非常大的图形,通过谷歌地图插件将其导出到 .JSON 以存储在 MySQL 中以便更快地参考,因为它太大了。这是没有数据库的理论证明:googlemapsexporter.firebaseapp.com/index2.html。我会给出一个更具体的错误,但到目前为止我使用的所有东西似乎都不适合这个项目。感谢您的回复!

标签: php mysql sql json mysql-workbench


【解决方案1】:

如何将这些信息存储在 MySQL 数据库中?

这个问题导致答案瘫痪。我可以想到十几种不同的方法,具体取决于您要如何提取数据、查询是离线还是在线、数据量、服务器端与嵌入式业务逻辑等等。

从根本上说,SQL 是声明性的:你告诉它你想要输出什么数据,然后引擎会找出最好的方式给你。因此,当面对原始数据的空白时,您的重点是列出数据将回答的问题。以下是几个例子:

  1. 有多少条边比 N 个单位短?这些是什么?按长度排序。
  2. N 个单位内有多少个顶点?这些是什么?按边长成对排列。
  3. 在最小边界矩形 [x1,y1,x2,y2] 内有多少个顶点?这些是什么?有多少个连接到 MBR 之外的另一个顶点?

如果不知道您希望从数据中得到什么样的答案,任何人(甚至您)都不可能构建解决方案。

尽管如此,您可能需要更多地探索一些途径来弄清楚这些问题是什么。以下是一些可能的方法:

  1. 创建表 nodesedgesconnections,并为每个相应的属性创建一个列:weightsize 等。使用像 jq 这样的命令行工具来迭代每个“节点”和每个“边”,插入到各自的表中。显然,使用sourcetarget 进行连接。
  2. 与上面类似,但不是每个属性都有一个列,而是使用 MySQL JSON 类型来保存原始 JSON。使用 MySQL 进行查询。

【讨论】:

  • 哇,好帖子!感谢您的洞察力。现在我想我会尝试使用 MySQL 来保存原始 JSON,然后在我对一切工作方式更加熟悉时从那里开始。
  • 虽然,我尝试制作一个类似于您所说的表格:ideone.com/F4FRU8 不确定我是否做对了
  • 看起来正确,在 MySQL 5.6.23 中对我有用。我建议您在不同的数据库环境中尝试。
  • 感谢您的检查!该表对我来说也很好,尽管插入值完全是另一回事。我真的更喜欢使用其他一些数据库环境,但不幸的是我被 MySQL 困住了。任何人,我不会再打扰你了,再次感谢!
【解决方案2】:

我以前也遇到过你的情况。据我所知,没有多少“一刀切”,尤其是对于导入 XML/JSON 数据。您可能必须创建一个模型类才能使 ORM 正常工作。一个简单的导入任务似乎需要做很多工作。

我建议创建自己的 PHP 脚本来读取 JSON、迭代元素和节点,然后最后执行参数化查询以将值绑定到 SQL 插入查询中。

【讨论】:

  • @Machavity 谢谢。感谢您的帮助。
  • 感谢@jmsweb ,如果一切都失败了,我会尝试尝试您的方法。非常感谢您的洞察力
【解决方案3】:

我不知道你知道任何框架,但你可以使用例如Symfony 框架 有一个 Bundle 可以提供帮助:

http://jmsyst.com/bundles/JMSSerializerBundle

使用这个名为 Doctrine 的包和库,您可以将任何 json(具有关系的事件)反序列化为实体类并保存在数据库中 但是,如果您从未使用过其中任何一种,则可能很难实现它

【讨论】:

  • 看起来很有趣,我以前从来没有用过这个。不过我还是会去看看的!
猜你喜欢
  • 2013-06-26
  • 2011-01-30
  • 1970-01-01
  • 2019-09-19
  • 2014-05-23
  • 2015-06-05
  • 2020-12-07
  • 2018-11-26
  • 2017-08-25
相关资源
最近更新 更多