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

时间:2013-02-08 14:44:34

标签: c# java c++ python sql

我目前有一个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。

我需要查询customerOrderForPickup的数量和值或事务的grandTotal等内容,并作为各种此类事务JSON的分类**

我想对如何进行一些建议:1)将这些JSON文件存储在服务器上,文件系统即2)我应该使用什么样的数据库来查询这些JSON文件复杂的结构

我的研究产生了以下几种可能性:1)使用MongoDB数据库存储对象的JSON代表并通过数据库进行查询。如何存储JSON文件?将事务JSON存储在MongoDB数据库中的最佳方法是什么? 2)将包含唯一全局ID,用户ID和服务器上JSON文件地址的SQL数据库与这些文件上的聚合代码耦合在一起。我怀疑这是否可以缩放

如果有人对这个问题有任何见解会很高兴。感谢。

1 个答案:

答案 0 :(得分:1)

我会说你的问题非常笼统,而且非常符合风格和喜好。你可以用10种不同的方式做到这一点,每一种都非常好。

我会根据自己的个人喜好以及如何做到这一点:

由于存在大量数据,我会使用关系数据库 - SQL Server。因为我喜欢Microsoft工具和ASP MVC(我知道有很多人没有,但我的偏好)并且它有一个可以将JSON转换为c#对象的序列化器。由于我也喜欢使用实体框架,并且实体框架可以将c#对象转换为数据库内容,我只需要构建一个数据库,就像我的JSON对象看起来一样。然后我会有一个接受那些JSON实体的api,ASP MVC会自动将它们转换为c#对象,实体框架会自动将它们转换为数据库行。这样整个上传API就需要多行代码才能完成。

然后,我会为不同类型的查询数据制作更多的API方法。 Linq和实体框架有时会将不同的查询简单化为一行代码。