从关系数据库中提取JSON的通用方法?

时间:2013-05-06 20:07:57

标签: sql-server json mongodb migration relational-database

好吧,也许这对于StackOverflow而言过于宽泛,但是有一种很好的通用方法可以将关系表中的数据组合成分层JSON吗?

例如,假设我们有一个“客户”表和一个“订单”表。我希望输出看起来像这样:

{
    "customers": [
        {
            "customerId": 123,
            "name": "Bob",
            "orders": [
                {
                    "orderId": 456,
                    "product": "chair",
                    "price": 100
                },
                {
                    "orderId": 789,
                    "product": "desk",
                    "price": 200
                }
            ]
        },
        {
            "customerId": 999,
            "name": "Fred",
            "orders": []
        }
    ]
}    

我宁愿不必编写大量的过程代码来遍历主表并一次获取几个订单并附加它们。这将是非常缓慢的。

我正在使用的数据库是MS SQL Server,但我很快就需要对MySQL做同样的事情。我正在使用Java和JDBC进行访问。如果这些数据库中的任何一个都有一些神奇的方法来组装服务器端的这些记录,那将是理想的。

人们如何从关系数据库迁移到像MongoDB这样的JSON数据库?

5 个答案:

答案 0 :(得分:1)

以下是一组有用的函数,用于将关系数据转换为JSON和XML以及从JSON转换回表:https://www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/

答案 1 :(得分:1)

SQL Server 2016终于迎头赶上并添加了对JSON的支持。

JSON支持仍然与PostgreSQL等其他产品不匹配,例如:不包含特定于JSON的数据类型。但是,添加了几个有用的T-SQL语言元素,使得使用JSON变得轻而易举。

E.g。在以下Transact-SQL代码中,定义了包含JSON字符串的文本变量:

DECLARE @json NVARCHAR(4000)
SET @json = 
N'{
    "info":{  
      "type":1,

      "address":{  
        "town":"Bristol",
        "county":"Avon",
        "country":"England"
      },
      "tags":["Sport", "Water polo"]
   },
   "type":"Basic"
}'

然后,您可以使用JSON_VALUEJSON_QUERY函数从JSON文本中提取值和对象:

SELECT
  JSON_VALUE(@json, '$.type') as type,
  JSON_VALUE(@json, '$.info.address.town') as town,
  JSON_QUERY(@json, '$.info.tags') as tags

此外,OPENJSON函数允许从引用的JSON数组中返回元素:

SELECT value
FROM OPENJSON(@json, '$.info.tags')

最后但并非最不重要的是,有一个FOR JSON子句可以将SQL结果集格式化为JSON文本:

SELECT object_id, name
FROM sys.tables
FOR JSON PATH

一些参考文献:

答案 2 :(得分:0)

我认为一个概括的'解决方案如下: -

  1. 创建一个'选择'查询将连接所有必需的表以获取2维数组中的结果(如CSV /临时表等
  2. 如果此连接的每一行都是唯一的,并且MongoDB架构和列具有一对一映射,则全部使用带有所需参数的MongoImport命令导入此CSV /表。
  3. 但是如上所述,在给定的客户ID可以包含'订单' 的数组的情况下,需要在mongoImport之前进行一些计算。
    您必须编写一个可以“垂直合并”的程序。给定客户ID的订单。对于一小组数据,一个简单的java程序将起作用。但对于较大的集合,使用spark进行并行编程可以完成这项工作。

答案 3 :(得分:0)

SQL Server 2016现在支持读取JSON的方式与支持XML的方式大致相同。使用OPENJSON直接查询和存储的JSON数据类型。

答案 4 :(得分:-1)

没有通用方法,因为SQL Server不支持JSON作为其数据类型。你必须为此创建自己的“通用方法”。

查看这篇文章。关于如何将sql server数据操作为JSON格式,有很好的例子。

https://www.simple-talk.com/blogs/2013/03/26/sql-server-json-to-table-and-table-to-json/