php – PostgreSQL – 树组织

我正在开发一个项目,需要一个类别树,组织为id,parent,title table.在Postgres中哪些是检索类别及其子类别(以及完整树,如果根类别具有parent = 0)的最佳方法?我正在寻找一个数据库解决方案,但如果有一种方法可以用于RubyPHP – 它也会很棒.

主要目标是选择子句的速度,因为此表中的数据对于更新/插入/删除速度并不重要.

UPD:还会有路径搜索,我的意思是从当前顶点(类别)到根类别的路径.

解决方法:

retrieve category and its subcategories

如果您只有有限的子项目深度,您可以使用自联接来完成此操作,例如.两层深:

SELECT *
FROM categories AS child
LEFT JOIN categories AS parent ON parent.id=child.parent
LEFT JOIN categories AS grandparent ON grandparent.id=parent.parent
WHERE child.id=(id) OR parent.id=(id) OR grandparent.id=(id);

对于使用标准sql而不是’parent-id-foreign-key’类型模式的任意深度层次结构,您不能这样做.

有些DBMS提供了非标准的分层工具,允许以各种方式使用这种类似的东西,但如果你想坚持使用跨DBMS兼容的代码,你需要将模式重新设置为表示层次结构的更好模型之一.两个流行的是:

> Nested Set.存储一个线性排序,表示目标表的两列中树的深度优先搜索(如果您的目标具有显式排序,则其中一个已经拥有).
> Adjacency Relation.将每个祖先/后代对存储在单独的连接表中.

每种方法都有优点和缺点,并且有许多变体(例如,稀疏嵌套集编号,AR中的“距离”),这可能影响各种类型的添加/删除/移动位置操作的成本.我个人倾向于倾向于简化嵌套集模型,因为它包含的冗余少于AR.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...