And*_*dré 5 postgresql database-design hierarchical-data
我正在设计一个数据库,我对在关系数据库中使用Hierarchical数据模型有一些疑问.
如果我想处理类别,子类别和父类别,是否可以不在关系数据库中使用分层数据模型?换句话说,可以使用关系做事方式处理类别,子类别和父类别?
顺便说一下,我正在使用PostgreSQL.
对不起,我的英语不好.
最好的祝福,
Fra*_*ens 18
您有两种存储层次结构的选项:
如果你有PostgreSQL版本8.4或更高版本,你可以使用重复查询来使事情变得非常简单.这是迄今为止最简单的解决方案,易于查询,易于插入新记录,易于更新当前记录,易于删除记录并且您具有参照完整性.所有其他解决方案都有难以解决的问题.
附件清单:
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
parent_id BIGINT,
category TEXT NOT NULL,
FOREIGN KEY (parent_id) REFERENCES categories(id)
);
INSERT INTO categories(parent_id, category) VALUES(NULL, 'vehicles');
INSERT INTO categories(parent_id, category) VALUES(1, 'cars');
INSERT INTO categories(parent_id, category) VALUES(1, 'motorcycles');
INSERT INTO categories(parent_id, category) VALUES(2, 'SUV');
INSERT INTO categories(parent_id, category) VALUES(2, 'sport');
INSERT INTO categories(parent_id, category) VALUES(3, 'cruising');
INSERT INTO categories(parent_id, category) VALUES(3, 'sport');
WITH RECURSIVE tree (id, parent_id, category, category_tree, depth)
AS (
SELECT
id,
parent_id,
category,
category AS category_tree,
0 AS depth
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT
c.id,
c.parent_id,
c.category,
tree.category_tree || '/' || c.category AS category_tree,
depth+1 AS depth
FROM tree
JOIN categories c ON (tree.id = c.parent_id)
)
SELECT * FROM tree ORDER BY category_tree;
Run Code Online (Sandbox Code Playgroud)
结果:
'1', '', '车辆', '车辆', '0'
'2', '1', '汽车', '车辆/车', '1'
'4', '2', 'SUV', '车辆/汽车/ SUV', '2'
'5', '2', '运动', '车辆/汽车/运动', '2'
'3', '1', '摩托车', '车辆/摩托车', '1'
'6', '3', '巡航', '车辆/摩托车/巡航', '2'
'7', '3', '运动', '车辆/摩托车/运动', '2'
归档时间: |
|
查看次数: |
3739 次 |
最近记录: |