【发布时间】:2015-01-15 16:49:30
【问题描述】:
我有这个使用 PostgreSQL 的 ltree 模块构建的物化路径树结构。
- id1
- id1.id2
- id1.id2.id3
- id1.id2.id5
- id1.id2.id3.id4 ...等
我当然可以轻松地使用 ltree 从整个树或特定路径/子路径中获取所有节点,但是当我这样做时,自然得到的是很多行(相当于一个数组/切片最后的节点.. Golang/您使用的任何编程语言)
我所追求的是获取树 - 理想情况下从某个开始和结束路径/点 - 作为分层 JSON 树对象等
{
"id": 1,
"path": "1",
"name": "root",
"children": [
{
"id": 2,
"path": "1.2",
"name": "Node 2",
"children": [
{
"id": 3,
"path": "1.2.3",
"name": "Node 3",
"children": [
{
"id": 4,
"path": "1.2.3.4",
"name": "Node 4",
"children": [
]
}
]
},
{
"id": 5,
"path": "1.2.5",
"name": "Node 5",
"children": [
]
}
]
}
]
}
我从线性(非分层)行/数组/切片结果集中知道,我当然可以在 Golang 中展开路径并在那里创建必要的业务逻辑来创建这个 json,但如果它肯定会好得多有一种方便的方法可以直接使用 PostgreSQL 实现这一点。
那么,您将如何在 PostgreSQL 中将 ltree 树结构输出到 json - 可能是从开始到结束的路径?
如果你不知道 ltree,我想这个问题可以更概括为“Materalized path tree to hierachical json”
此外,除了 ltree 路径之外,我还在考虑在所有节点上添加 parent_id,因为至少我可以使用该 id 使用递归调用来获取我猜想的 json...我考虑过在 parent_id 上放置一个触发器,以根据父 ID 发生变化的时间来管理路径(保持更新)——我知道这是另一个问题,但也许你也可以告诉我你的意见,关于这个?
我希望一些天才可以帮助我解决这个问题。 :)
为方便起见,这里有一个示例创建脚本,您可以使用它来节省时间:
CREATE TABLE node
(
id bigserial NOT NULL,
path ltree NOT NULL,
name character varying(255),
CONSTRAINT node_pkey PRIMARY KEY (id)
);
INSERT INTO node (path,name)
VALUES ('1','root');
INSERT INTO node (path,name)
VALUES ('1.2','Node 1');
INSERT INTO node (path,name)
VALUES ('1.2.3','Node 3');
INSERT INTO node (path,name)
VALUES ('1.2.3.4','Node 4');
INSERT INTO node (path,name)
VALUES ('1.2.5','Node 5');
【问题讨论】:
标签: json postgresql tree materialized-path-pattern ltree