如何存储数十亿个JSON文件并进行查询

1 投票
1 回答
3630 浏览
提问于 2025-04-17 15:14

我现在有一个API,它可以接收JSON文件(这些文件是包含用户交易数据的JSON序列化对象),并将这些数据存储到服务器上。每个这样的JSON文件都有一个唯一的全球ID和一个与之关联的用户。每天会生成数十亿个这样的文件。用户应该能够查询与自己相关的所有JSON文件,并根据这些文件生成一些汇总结果。

一个典型的需要存储的JSON文件大概长这样:

[ { "currencyCode" : "INR",
"receiptNumber" : { "value" : "1E466GDX5X2C" },
"retailTransaction" : [ { "grandTotal" : 90000.0,
      "lineItem" : [ { "otherAttributes" : {  },
            "sale" : { "description" : "Samsung galaxy S3",
                "discountAmount" : { "currency" : "INR",
                    "value" : 2500
                  },
                "itemSubType" : "SmartPhone",
                "otherAttributes" : {  },
                "unitCostPrice" : { "quantity" : 1,
                    "value" : 35000
                  }
              },
            "sequenceNumber" : 1000
          },
          { "customerOrderForPickup" : { "description" : "iPhone5",
                "discountAmount" : { "currency" : "INR",
                    "value" : 5000
                  },
                "itemSubType" : "SmartPhone",
                "otherAttributes" : {  },
                "unitCostPrice" : { "quantity" : 1,
                    "value" : 55000
                  }
              },
            "otherAttributes" : {  },
            "sequenceNumber" : 1000
          }
        ],
      "otherAttributes" : {  },
      "reason" : "Delivery",
      "total" : [ { "otherAttributes" : {  },
            "type" : "TransactionGrossAmount",
            "value" : 35000
          } ]
    },
    null
  ],
"sequenceNumber" : 125435,
"vatRegistrationNumber" : "10868758650"
} ]

上面的JSON是一个复杂对象的序列化版本,它包含了其他类的单个对象或对象数组作为属性。所以' receiptNumber'就是这个JSON文件的通用ID。

我需要查询一些信息,比如客户提货订单的数量和价值,或者交易的总金额,并对这些交易的多个JSON进行汇总。

我希望能得到一些建议,关于:1)如何在服务器上存储这些JSON文件,文件系统方面;2)我应该使用什么样的数据库来查询这些结构复杂的JSON文件。

经过我的研究,得出了一些可能的方案:1)使用MongoDB数据库来存储对象的JSON表示,并通过数据库进行查询。JSON文件将如何存储?在MongoDB数据库中存储交易JSON的最佳方式是什么?2)将一个包含唯一全球ID、用户ID和服务器上JSON文件地址的SQL数据库与这些文件的汇总代码结合起来。我怀疑这种方式是否能扩展。

如果有人对这个问题有任何见解,我将非常感激。谢谢。

1 个回答

3

我觉得你的问题很宽泛,实际上是个人风格和偏好的问题。你可以用十种不同的方法来实现,每种方法都很好。

我来分享一下我的个人偏好和做法:

因为数据量很大,我会选择使用关系型数据库,比如 SQL Server。因为我喜欢微软的工具和 ASP MVC(我知道有很多人不喜欢,但这是我的选择),而且它有一个序列化工具,可以把 JSON 转换成 C# 对象。由于我也喜欢使用实体框架(Entity Framework),它可以把 C# 对象转换成数据库中的内容,所以我会把数据库的结构设计成和我的 JSON 对象一样的样子。然后我会创建一个 API,接受这些 JSON 数据,ASP MVC 会自动把它们转换成 C# 对象,而实体框架会自动把它们变成数据库中的行。这样,整个上传 API 的代码量不会超过几行。

接着,我会为不同类型的数据查询创建更多的 API 方法。使用 Linq 和实体框架,有时候只需要一行代码就能轻松完成各种查询。

撰写回答