问题标签 [nested-sets]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 嵌套集层次结构中的多个表
我有许多不同的项目存储在不同的 MySQL 表中,我想将它们放入树层次结构中。使用邻接表模型,我可以为每个表添加一个 parent_id 字段,并使用外键关系链接这些表。
但是,我想使用嵌套集/修改的预序树遍历模型。数据将在严重偏向于读取的环境中使用,并且我希望运行的查询类型支持这种方法。
问题是我在嵌套集上的所有信息都假设您只有一种类型的项目,存储在一个表中。我能想到的解决方法是:
- 树中有多个外键字段,每个表/项目类型一个。
- 在树结构中存储项目表的名称以及项目 ID。
至少可以说这两种方法都不优雅,那么有没有更好的方法呢?
sql - SQL Server 树层次结构和具有重复记录 id 的嵌套集
鉴于我有这个结果集结构(多余的字段已被剥离)
是否可以按树顺序返回记录,即Parent
,Children
如果 aChild
是 a Parent
,那么它们的Children
,如果不是 thenSibling
等等?例如,
我能想到的唯一方法就是遵循这篇文章 -
并针对每条记录包含[LeftExtent]
和[RightExtent]
字段。现在文章中的 SQL 在Ids
唯一时可以正常工作,但是在这种特定的树结构中,相同的记录Id
可能会出现在树中的不同位置(ParentId
显然字段不同)。我认为问题出在文章中的这个 SQL 中 -
如何更改它以允许为具有重复的记录Ids
提供 [LeftExtent] 和 [RightExtent] 值,或者我完全错过了一种更简单的方法来按我需要的顺序返回结果集?
python - 嵌套集模型和 SQLAlchemy——添加新节点
应该如何使用 SQLAlchemy 将新节点添加到使用嵌套集模型实现的树中?
我需要表上的触发器来分配新节点lft
并rgt
更新所有其他受影响的节点,但是定义节点位置的最佳方法是什么?我可以将parent_id
新节点的 传递给构造函数,但是我如何将 传递parent_id
给触发器?
mysql - 搜索嵌套集
我有一个 MySQL 表,它的作用类似于嵌套集,以包含类别层次结构。表架构如下所示:
lft
并rgt
定义节点的左右边界(嵌套集的工作方式是每个节点的 id 都落在其父节点的边界内),并parent_id
指定父节点。唯一索引允许有多个具有相同名称的类别,只要它们没有相同的父类别。
我试图找出一种基于层次结构在集合中找到特定节点的正确方法。例如,如果我查找 foo/bar/baz,我想检索名为 baz 的节点,其父节点名为 bar,其父节点名为 foo。显然,我不能只按名称搜索,因为可能有多个具有相同名称的类别。
我能想到的方法是找到最顶层的类别,然后找到具有给定名称的每个后续类别,其父 id 是先前找到的类别的名称,但这对我来说似乎不是很有效。有没有更好的方法来搜索嵌套集?
sql - 如何将嵌套集中的所有记录呈现到真正的 html 树中
我awesome_nested_set
在我的 Rails 项目中使用该插件。我有两个看起来像这样的模型(简化):
数据库中的树按预期构建。和的所有值都是正确的parent_id
。树有多个根节点(这当然是允许的)。lft
rgt
awesome_nested_set
现在,我想以正确排序的树状结构呈现给定客户的所有类别:例如嵌套<ul>
标签。这不会太难,但我需要它高效(sql 查询越少越好)。
更新:发现可以计算树中任何给定节点的子节点数,而无需进一步的 SQL 查询:number_of_children = (node.rgt - node.lft - 1)/2
. 这并不能解决问题,但可能会有所帮助。
ruby-on-rails - awesome_nested_set
我有一个选择输入:
f.select :category_id, nested_set_options(Category, @categories) {|i| "#{'-' * i.level} #{i.name}" }
仅显示 level > 1 的类别的最有效方法是什么?
mysql - 触发器:嵌套集的邻接列表
我在遗留系统上有一个邻接列表,我想递归查询(需要获取小计等)。
我可以在 MySQL 中创建一个触发器,将其存储在单独的表中,或者将给定集合的“嵌套集等效”存储在同一个表的单独列中吗?
我的套餐是这样的:
我要这个:
database - 允许一个类别有多个父母有意义吗?有替代品吗?
简短的问题:应该如何管理出现在多个类别下的产品类别?这样做是一个坏习惯吗?
背景信息: 我们有一个产品数据库,其类别如下:
请注意,胶水和回形针被分配给这两个类别。虽然它们出现在这个类别树中的两个不同位置,但它们在数据库中具有相同的类别 ID。为什么?两个原因:
- 类别被分配了属性——例如,回形针可以有重量、材料、颜色等。
- 分配到胶水类别的产品显示在工艺品和办公用品下。这是意料之中的——它们与数据库中的实际类别 ID 相同。
这使我们能够管理单个类别及其属性和分配的产品,但将其放置在类别树中的多个位置。
我们使用的是嵌套集模型,所以我们用来支持它的 db 结构是:
因此,Category 和 CategoryTree 之间存在 1:M,因为在类别树中可以有给定类别的多个实例。
是否有一种更简单的方法来对此进行建模,以允许产品类别显示在多个类别下?
mysql - 对 MPTT 结果集中的项目进行排序?
我正在使用MPTT(修改的预序树遍历)模型将分层数据存储在我的 MySQL 表中。(MPTT 模型:另一种描述是嵌套集模型。)。我的问题是:有没有人想出一种聪明的方法来对树上的查询结果进行排序?我可以只使用“按标签排序”,但结果集将按标签排序,而不考虑节点在树中的位置或深度。
这是我用来检索任意节点的树的查询示例,每个节点的深度:
根据http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/。
当然,这总是按项目在嵌套集中的位置排序。如果我想通过“lastName”或“accountBalance”或“town”来订购它们怎么办?这可以在 MySQL 中完成,还是你们认为我必须求助于我的脚本语言对结果进行排序?