我已经为我的移动应用后端切换到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的新手,我相信它的所有功能都会很优雅。我能想到的只是创建我可以查询的视图表,但不确定如何为此构建查询。
答案 0 :(得分:3)
如果您要查询一组表,并且希望将输出作为JSON数据结构返回,那么现在有两种选择:
执行查询,并将结果转换为应用程序后端中的JSON。这是一种相当标准的方法,可能仍然是最简单的方法,特别是如果您编写后端的语言具有良好的JSON支持。
构造查询,使其返回以JSON编码的结果,这可以归功于PostgreSQL 9.2及更高版本。
这个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支持的成熟,我希望它会变得更容易。