PostgreSQL数据库模型

时间:2014-02-08 03:39:25

标签: sql json postgresql

我已经为我的移动应用后端切换到PostgreSQL,并尝试找出存储和查询数据的最佳方式。问题是存储数据最好是SQL,但检索数据最好是文档。

例如,我有表项:

+----+--------+------+
| id | title  | uuid | 
+----+--------+------+
|  1 | Hello  |  32  |
|  2 | World  |  25  |
|  3 | Tom    |  435 |
+----+--------+------+

然后表记录:

+----+---------+----------+
| id | itemId  | resource | 
+----+---------+----------+
|  1 | 1       |  res1    |
|  2 | 1       |  res2    |
|  3 | 1       |  res3    |
|  4 | 2       |  res4    |
+----+---------+----------+

这是几乎标准的SQL方法。现在我想得到的是:

{
  id: 1,
  title: "Hello",
  uuid: 32,
  records: [
    {id: 1, resource: "res1"},
    {id: 2, resource: "res2"}, 
    {id: 3, resource: "res3"}
  ]
}

我想你得到的照片。我是PostgreSQL的新手,我相信它的所有功能都会很优雅。我能想到的只是创建我可以查询的视图表,但不确定如何为此构建查询。

1 个答案:

答案 0 :(得分:3)

如果您要查询一组表,并且希望将输出作为JSON数据结构返回,那么现在有两种选择:

  1. 执行查询,并将结果转换为应用程序后端中的JSON。这是一种相当标准的方法,可能仍然是最简单的方法,特别是如果您编写后端的语言具有良好的JSON支持。

  2. 构造查询,使其返回以JSON编码的结果,这可以归功于PostgreSQL 9.2及更高版本。

  3. 这个article很好地介绍了后一种方法。这是一个查询,它为您提供上述请求:

    select row_to_json(t)
    from (
      select items.id,
        items.title,
        items.uuid,
        (
            select array_to_json(array_agg(row_to_json(d)))
            from (
                select records.id,
                    records.resource
                from records
                where items.id=records.itemid
            ) d
        ) as records
      from items
      where items.id=1
    ) as t;
    

    结果:

    {
      "id": 1,
      "title": "Hello",
      "uuid": "32",
      "records": [
        {
          "id": 1,
          "resource": "res1"
        },
        {
          "id": 2,
          "resource": "res2"
        },
        {
          "id": 3,
          "resource": "res3"
        }
      ]
    }
    

    我使用jsonprettyprint.com让它看起来更漂亮 - 它实际上是一行而没有缩进,但仍然非常有效。

    以这种方式创建JSON输出非常繁琐,至少对我来说是这样。我可能更喜欢在应用程序中这样做。但随着JSON支持的成熟,我希望它会变得更容易。