具有这种简单的多对多自引用结构。
一个项目通过表拥有其他项目joins
:
CREATE TABLE items (
item_id serial PRIMARY KEY
, title text
);
CREATE TABLE joins (
id serial PRIMARY KEY
, item_id int
, child_id int
);
INSERT INTO items (item_id, title) VALUES
(1, 'PARENT')
, (2, 'LEVEL 2')
, (3, 'LEVEL 3.1')
, (4, 'LEVEL 4.1')
, (5, 'LEVEL 4.2')
, (6, 'LEVEL 3.2')
;
INSERT INTO joins (item_id, child_id) VALUES
(1, 2)
, (2, 3)
, (3, 4)
, (3, 5)
, (2, 6) …
Run Code Online (Sandbox Code Playgroud) 我们有这个漂亮的 Postgres 树生成器。然而,它会产生一棵树的切口,而不是一次产生整棵树:
item_id jsonb_pretty
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.2",
"item_id": 6
}
}
}
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.1",
"item_id": 3,
"children": {
"title": "LEVEL 4.1",
"item_id": 4
}
}
}
}
1 {
"title": "PARENT",
"item_id": 1,
"children": {
"title": "LEVEL 2",
"item_id": 2,
"children": {
"title": "LEVEL 3.1",
"item_id": …
Run Code Online (Sandbox Code Playgroud) 我个人对数据结构很感兴趣,并且知道行存储索引存储在它们后面的 B 树,我总是很好奇尝试可视化那些 B 树对于给定表/索引的样子。
有没有办法通过执行计划、统计信息、运算符属性、索引/表属性等关联或公开给定行存储索引的 B 树中的节点数?
此外,我可以做同样的事情来确定特定查询遍历的节点数吗?
如果有一种方法也可以确定 B 树中的叶节点数,则加分。
我有带有递归外键的表。它只是层次树结构:
CREATE TABLE tree (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
value INTEGER NOT NULL,
tree_id SMALLINT NOT NULL CHECK (tree_id > CAST(0 AS SMALLINT)),
parent_id INTEGER REFERENCES tree ON DELETE RESTRICT ON UPDATE RESTRICT,
EXCLUDE (tree_id WITH =) WHERE (parent_id IS NULL) -- allow only one root within tree
);
Run Code Online (Sandbox Code Playgroud)
如何拒绝插入非空parent_id
和不同的记录tree_id
?即外键parent_id
只能引用id
同一个内的主键tree_id
。
tree ×4
postgresql ×3
recursive ×3
cte ×2
json ×2
btree ×1
constraint ×1
foreign-key ×1
index ×1
sql-server ×1