假设您有一个存储有序树层次结构的平面表:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Run Code Online (Sandbox Code Playgroud)
这是我们所拥有的图表[id] Name
.根节点0是虚构的.
[0] ROOT / \ [1] Node 1 [3] Node 2 / \ \ [2] Node 1.1 [6] Node 1.2 [5] Node 2.1 / [4] Node 1.1.1
您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?
进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手.该表表示为结果集,可以随机访问.
伪代码或普通英语是可以的,这纯粹是一个概念性的问题.
额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?
编辑和补充
回答一个评论者(Mark Bessey的)问题:根节点不是必需的,因为它永远不会被显示.ParentId = 0是表示"这些是顶级"的惯例.Order列定义了如何对具有相同父节点的节点进行排序.
我所谈到的"结果集"可以被描绘成一组哈希图(保留在该术语中).因为我的例子意味着已经存在.有些答案会加倍努力并首先构建它,但那没关系.
树可以任意深.每个节点可以有N个子节点.不过,我并没有考虑到"数百万条目".
不要将我选择的节点命名('Node 1.1.1')误认为是依赖的东西.节点同样可以称为"Frank"或"Bob",不暗示命名结构,这只是为了使其可读. …
在数据库中存储"有序列表"的最佳方法是什么,以便更新它们(添加,删除和更改条目的顺序)很容易?
考虑一个数据库,其中包含用户和电影的表格.每个用户都有一个喜欢的电影列表.
由于许多用户可以喜欢同一部电影,因此我将用户和电影分开,并使用第三张表连接它们,即用户电影.
usermovies包含用户和电影的ID以及"订单号".订单号用于为用户订购电影列表.
例如,用户Josh可能具有以下列表:
和用户杰克可能有一个列表,如:
因此,他们分享一些收藏,但不一定按照相同的顺序.
我可以使用查询获取每个用户的电影ID列表:
SELECT movie_id FROM usermovies WHERE user_id =? ORDER BY order_number
Run Code Online (Sandbox Code Playgroud)
然后,使用有序的movie_ids,我可以使用另一个查询获取电影列表
SELECT name FROM movies WHERE id in (?,?,?) ORDER BY FIELD (id, ?,?,?)
Run Code Online (Sandbox Code Playgroud)
所以查询工作,但更新列表现在看起来真的很复杂 - 是否有更好的方法来存储这些信息,以便很容易获得用户x的电影列表,添加电影,删除它们并更改列表的顺序?
我有一个包含许多行的MySQL表.该表有一个受欢迎的列.如果我按人气排序,我可以得到每个项目的排名.是否可以在不对整个表进行排序的情况下检索特定项目的等级?我不这么认为.那是对的吗?
另一种方法是创建一个用于存储排名的新列,对整个表进行排序,然后遍历所有行并更新排名.这是非常低效的.有没有办法在单个查询中执行此操作?
我从Sqlite数据库中的项目表中检索有序的项目列表.我如何交换id以使Sqlite数据库表中的两个项的顺序?