5

只有一个大的 JSON 文件。例如,

{   
    "Name": "Motor_M23",
    "AASID": {
        "IDType": "URI",
        "IDSpec": "http://acplt.org/AAS/Motor_M23"
    },
    "AssetID": {
        "IDType": "URI",
        "IDSpec": "http://acplt.org/Assets/Motor_M23"
    },
    "Header": {
        "PropertyValueStatementContainers": [
            {
                "Name": "Config",
                        .
                        .
                        .
                        .

我需要支持以下操作:

  1. 查询一个元素应该返回所有子元素,例如查询AssetID应该返回

    "AssetID": {
        "IDType": "URI",
        "IDSpec": "http://acplt.org/Assets/Motor_M23"
    }
    
  2. 更新元素的值。

  3. 删除元素。
  4. 在层次结构级别之间移动元素,例如AssetID制作AASID.

我考虑了以下方法:

  1. 图形数据库:我开始阅读有关 Neo4J 的信息。但是,它不能智能地从 JSON 创建图形。必须指定节点类型及其层次顺序。
  2. ElasticSearch:它可以通过将 JSON 视为文本来工作,因此不是有效的解决方案。
  3. Postgres:它支持查询 JSON 对象,但更新、删除效率不高。

有没有什么好的数据库可以从大型 JSON 加载数据并处理我的操作?

4

4 回答 4

2

如果您只使用 JSON,那么您应该真正使用面向文档的数据库,因为它可以节省您与 sql 相关的东西。

MongoDB是一个不错的选择,支持很多驱动程序并且可以处理树结构(虽然我不确定自动创建)

CRUD操作简单,覆盖范围广。

对于繁忙服务器上的非常大的数据集,您应该使用XFS文件系统和WiredTiger存储引擎,因为在性能上有一些提升。

它得到了很好的支持,并且没有太多的学习曲线。(我来自 Pure SQL 没有太多麻烦)

您还可以选择MariaDBMySQL,尽管我两者都没有经验,但它们也都支持 JSON,而对于 MySQL,我觉得它只是一个“螺栓连接”,必须在面对升级时添加 -即将到来的要求。

于 2018-09-15T12:25:53.063 回答
2

这是选择正确数据库的典型架构问题,其中您必须考虑很多重要方面,例如 HA、弹性、复制、分片、工具支持、成熟度、许可、备份和恢复等。

MongoDB 和 Couchbase DB 是两个最流行和广泛使用的文档数据库。选择一个没有直接的答案,因为您必须进行权衡分析。我可以分享我的两分钱,希望这能帮助您做出正确的决定。

可以考虑 MongoDB 或 Couchbase NoSQL 文档数据库,因为 json 是两者中的一等公民,您可以获得使用字段执行操作的非常好的选择。

  1. MongoDB(CAP 之外的 CP 支持)更喜欢一致性而不是可用性,而 couchbase(CAP 之外的 AP)是高可用性数据库。
  2. MongoDB集群使用主/从架构,而couchbase集群使用点对点分布架构。

还有更多维度需要考虑,以下链接将带您走向正确的方向。

https://suyati.com/blog/mongodb-vs-couchbase/

https://www.couchbase.com/comparing-couchbase-vs-mongodb

因为,在您的特定情况下,您已经强调您只有一个大文件,因此也可以考虑使用基于IMDG(内存数据网格,如Apache Ignite )的解决方案设置单个节点。

于 2018-09-17T05:07:31.553 回答
0

Couchbase 的类似 SQL 的 N1QL 进行深度 JSON 遍历和操作。它还可以在查询时索引嵌套数组元素和 UNNEST 数组。它会做你所要求的。

于 2018-09-20T21:13:08.947 回答
-1

您可以根据您需要的操作逻辑以编程方式解析和保存 SQL 表中的数据:

  1. 将所有子项(包含所有内容)作为文本保存在 1 个表格中,每个顶部元素。

元素 | 儿童(文字)

"AssetID" |  {
        "IDType": "URI",
        "IDSpec": "http://acplt.org/Assets/Motor_M23"
    },
  1. 将元素保存在表格中,并将每个顶部元素的第一级子项(包含所有内容)分开。

身份证 | 元素

元素 ID | 孩子(文字)

1 | "AssetID"

1 | "IDType": "URI"
1 | "IDSpec": "http://acplt.org/Assets/Motor_M23"
  1. 将元素(名称)保存在表中,id 和父 id 以无限级别解析,如果没有孩子则值。这样,您可以查询所有元素(在任何级别)和内容,并根据需要进行更新。您还可以根据 id 和父 id 从任何元素进行解析。

身份证 | 元素 | 家长 | 价值

1  | "Name"   | 0 | "Motor_M23"
2  | "AASID"  | 0 | - 
3  | "IDType" | 2 | "URI",
4  | "IDSpec" | 2 | "http://acplt.org/AAS/Motor_M23"
5  | "AssetID"| 0 | -
6  | "IDType" | 5 | "URI",
7  | "IDSpec" | 5 | "http://acplt.org/Assets/Motor_M23"
8  | "Header" | 0 | -
9  | "PropertyValueStatementContainers" | 8 | -
10 | "Name"   | 9 | "Config"
于 2018-09-14T16:22:45.580 回答