MySQL - 处理这种分层数据的最佳方法?

2023-11-21

这是以下内容的后续内容:
MySQL - 是否可以获取层次结构中的所有子项?

我有一个任意深度邻接表模型表(我现在的情况是can将其转换为嵌套集合模型.

我阅读了有关如何使用嵌套集合模型的 MySQL 数据,尽管执行插入、更新和删除等基本功能似乎变得越来越复杂且非常复杂。

另一个博客展示了如何使用带有邻接列表模型的触发系统来保存将每个对象与其祖先相关联的祖先表。


现在我需要能够返回给定节点的所有子节点的列表,以更改或删除它们。这种层次结构一旦创建就不会一直变化,但会产生大量的层次结构。

我看到的三种方法是:

  1. 创建了一个存储过程这将执行返回所有子项的递归查询。

  2. 转换为嵌套集模型这需要考虑复杂性,并可能创建一个存储过程来在其中添加、编辑和删除。

  3. 创建祖先表上面描述了插入/删除触发器来处理所有数据。

如果还有我没有探索的其他方法,请告诉我,我将更新此列表。


Quassnoi对嵌套集模型和邻接列表模型运行了一些性能测试,并在他的博客文章中记录了结果和建议邻接表与嵌套集:MySQL。执行摘要是:

  • 嵌套集可以更快地获取所有子节点或所有父节点。
  • 如果您经常需要更新表,则嵌套集不是一个好主意。

这是他文章的结论:

在 MySQL 中,如果层次结构的更新不频繁,并且在更新期间锁定表(在长表上可能需要几分钟)是可以承受的,则应首选嵌套集模型。

这意味着使用 MyISAM 存储引擎创建表,创建如上所述的 GEOMETRY 类型的边界框,使用 SPATIAL 索引对其进行索引,并将级别保留在表中。

如果表的更新频繁,或者更新所带来的长时间锁定表的负担无法承受,那么应该使用邻接表模型来存储分层数据。

这需要创建一个函数来查询表。

本文的其余部分将展示如何定义表、实现查询并提供性能测量。使用空间索引是一个聪明的想法,可以提高您可能不熟悉的嵌套集模型的性能。


如果您也在考虑不使用 MySQL 的方法,那么您可能需要看看PostgreSQL这是另一个免费的开源数据库。 PostgreSQL 支持以下形式的递归查询递归公用表表达式这使得查询分层数据比在 MySQL 中更容易,并且性能也更好。 Quassinoid 也写过一篇文章邻接表与嵌套集:PostgreSQL显示详细信息。

当我们谈论其他方法时,Oracle 的数据库也值得一提。 Oracle也有一个自定义扩展CONNECT BY这使得查询分层数据变得非常容易和快速。苦木素文章邻接表与嵌套集:Oracle再次涵盖性能细节。在这种情况下,获取所有子项所需的查询非常简单:

SELECT *
FROM yourtable
START WITH id = 42
CONNECT BY parent = PRIOR id
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL - 处理这种分层数据的最佳方法? 的相关文章

  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • MySQL:计算日期/时间之间的差异 - 仅在周一至周五“工作周”期间

    我需要计算开始日期 时间和结束日期 时间之间的差异 但是 我只想在 5 天的工作周内执行此操作 不包括周六 周日 做这个的最好方式是什么 我的想法是 从日期开始 我必须获取星期几 如果是工作日 那么我将添加到累加器中 如果不是 那么我不会添
  • Galera 集群问题

    我想在我们的生产环境中使用Galera集群 但我有一些顾虑 每个表必须至少定义一个显式主键 每个表必须运行在InnoDB或XtraDB存储引擎下 分批处理您的大额交易 例如 不要让一个事务插入 100 000 行 而是将其分成更小的块 例如
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • MySQL 和 Hibernate 之间的主键自增由谁负责?

    MySQL CREATE TABLE role id role INT 11 unsigned NOT NULL AUTO INCREMENT PRIMARY KEY id role AUTO INCREMENT 1 休眠 Entity p
  • 在 MySQL 中对整数字段运行带引号的数字(字符串)查询时会发生哪些复杂情况

    在 SQL 中 不应引用整数 因为如果引用 它将是一个字符串 但我很好奇如果我这样做会出现什么问题 并发症 例如 SELECT FROM table WHERE id 1 正确的 vs SELECT FROM table WHERE id
  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • PHP 和 MySQL - 高效处理多个一对多关系

    我正在寻求一些有关使用 MySQL 和 PHP 检索和显示数据的最佳方法的建议 我有 3 个表 所有一对多关系如下 Each SCHEDULE有很多覆盖每个覆盖都有很多地点 我想检索这些数据 以便它可以全部显示在单个 PHP 页面上 例如列
  • 慢速自动增量重置

    我有很多表 由于某些原因 我需要在应用程序启动时调整这些表的自动增量值 我尝试这样做 mysql gt select max id from item max id 97972232 1 row in set 0 05 sec mysql
  • 非常大的字段会对 MySQL 数据库产生负面影响吗?

    我目前正在使用 Django 构建一个网站 并希望托管用户生物样式页面 该页面可能长达几 KB 这些字段不一定需要搜索 但在查找用户名时确实需要提供 将这些数据存储在数据库中会产生负面影响吗 如果我使用带有数据库链接的静态文本文件 我的服务
  • 让登录更安全

    我已使用此代码进行管理员登录 仅当用户输入正确的用户名和密码时才应打开loginhome php 但后来我意识到这根本不安全 任何人都可以直接访问 mywebsite loginhome php 而无需登录 注销后 可以使用后退按钮打开 l
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • Mysql用in语句限制

    我正在写一个查询 SELECT user bookmarks id as user bookmark id bookmark id user bookmarks user id bookmark url bookmark website b
  • 删除行导致锁超时

    当我尝试从表中删除行时 我不断收到这些错误 这里的特殊情况是我可能同时运行5个进程 该表本身是一个 Innodb 表 约有 450 万行 我的 WHERE 子句中使用的列没有索引 其他指数按预期运行 这是在事务中完成的 首先删除记录 然后插
  • 如何通过Elasticsearch模糊匹配电子邮件或电话?

    我想通过 Elasticsearch 对电子邮件或电话进行模糊匹配 例如 匹配所有以以下结尾的电子邮件 gmail com or 匹配所有电话开头136 我知道我可以使用通配符 query wildcard email gmail com
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 学说迁移后备

    我们正在使用原则迁移 当迁移包含多个操作并且其中一个操作失败时 通常会出现问题 例如 如果迁移添加了 5 个外键 其中第 5 个失败 而字段长度不同 则修复字段错误并重新生成迁移不会not修复整个问题 而现在出现一个与 4 个密钥已存在有关

随机推荐

  • 如何提取

    标签之间的文本

    我想从 HTML 页面中提取文本p and li标签 这样我就可以开始对页面进行标记 为每个页面构建倒排索引 以便回答搜索查询 我怎样才能得到p使用 jsoup 的标签 Elements e doc select 该参数中要写入的字符串是什
  • 传递数据帧以在函数内进行变异

    我想传递一个数据框及其列 以供函数内的 dplyr 的 mutate 处理 这是一个例子 multifun lt function dataf vari mutate dataf newvar vari 2 multifun mtcars
  • 在 Haskell 中设置 argv[0]?

    有没有办法设置argv 0 在 Haskell 程序中 例如 用 ghc 编译的程序 我找到了getProgName and withProgNameSystem Environment 中的函数 但它似乎没有改变什么ps报告 Ubuntu
  • QComboBox AbstractItemView::item

    有没有办法可以增加 QComboBox 控件中列出的项目的高度 我尝试按照此处的建议进行操作在 QTDevNet 论坛中但没有运气 QComboBox QAbstractItemView item margin top 3px 我也尝试过这
  • 将 numpy 类型转换为 python

    我有一个从 pandas 生成的以下形式的字典列表 我想把它转换成json格式 list val 1 0 685 2 0 8 output json dumps list val 但是 json dumps 抛出错误 TypeError 6
  • PHP:如何使用 smtp 设置发送带有附件的电子邮件?

    我使用以下代码成功发送电子邮件 但现在我想在电子邮件中附加一个文本文件 例如 test txt 任何想法 require once Mail php from Usman lt email protected gt to Naveed lt
  • 具有 byte[] 字段作为存储过程参数的 DataTable

    我一直在重复使用这种使用 DataTable 作为存储过程参数的方法 并且效果很好 这是简化的工作代码 using dbEntities dbe new dbEntities var dt new dataTable dt Columns
  • 使用 OpenCV fitEllipse() 进行圆拟合

    使用OpenCV是否有效拟合椭圆用于圆拟合 fitEllipse 返回cv RotatedRect如何平均宽度和高度来获得拟合的圆半径 我认为使用的 有效性 cv fitEllipse拟合圆取决于您所需的拟合精度 例如 您可以在测试集上运行
  • HTMLCanvasElement 上未解决的方法 captureStream

    我的画布元素和方法有奇怪的情况captureStream 根据文档 HTMLCanvasElement 有一个方法captureStream 然而我的 Angular6 应用程序声称没有这样的方法 所以这段代码将不起作用 let canva
  • ITextSharp 解析包含图像的 HTML:它解析正确,但不会显示图像

    我正在尝试使用 ITextSharp 库从 html 生成 pdf 我能够创建 pdf 并将 html 文本转换为 pdf 文本 段落 我的问题 pdf 不显示我的图像 我的imghtml 中的元素 我所有的img我的 html 中的 ht
  • 如何 git 应用 git word diff

    我需要编辑一个混乱的提交 该提交仅更改了后续几行中的一个单词 保留其中一些更改并删除其他更改 这些变化很容易看出git diff word diff 并且以这种格式 我可以轻松地编辑帅哥来做我想做的事情 但现在我有一个像这样的文件 diff
  • 减少 App Store 中 iOS 应用程序的大小

    我正在尝试在 App Store 中提交应用程序 如果可能的话 我需要稍微减少其内存 我尝试了一种方法 我将在下面描述 来使我的应用程序更轻 但运气不佳 Details 我按照以下步骤查看导致尺寸如此之大的原因 将项目存档 分发它 节省用于
  • 简单的自定义事件

    我正在尝试学习自定义事件 并尝试创建一个 但似乎我遇到了问题 我创建了一个表单 静态类和自定义事件 我想要实现的是 当我按下按钮时 Form 将调用静态类函数 然后 func 将不时引发一个事件来报告当前状态 Form1 将侦听该事件是否引
  • 如何点击 Android 按钮然后转到 google play 应用程序

    我想知道如何制作一个 android 按钮可以点击并将用户重定向到 google play 示例 我想在用户单击我的活动中的按钮后将用户发送到 android 应用程序 https play google com store apps de
  • 更改 woocommerce 中每行的产品数量

    我正在使用 woocommerce 和 themefores 模板 默认情况下 woocommerce 每行显示 4 个产品 但我想显示 5 个 我正在使用子模板 因此我复制了 woocommerce 文件 并且里面有 content pr
  • apache-airflow 1.9 默认时区设置为非 utc

    我最近将气流版本从 Airflow 1 8 升级到 apache airflow 1 9 升级成功 并且我使用 Celery Executor 扩展了环境 一切似乎都工作正常 但 dag 和任务开始日期 执行日期等都出现在UTC 时区和计划
  • 正确终止在线程中运行的 Flask Web 应用程序

    How to properly terminate a flask web application that was launched in a separate thread I found an incomplete answer th
  • 使用 IIS 中托管的 WCF 处理长时间运行的服务操作的正确方法是什么?

    我正在构建一个 WCF 服务 该服务将公开多个操作 它将在 IIS 中运行 因为它需要 HTTPS 端点 大多数操作将在几秒钟或更短的时间内完成 但是 其中一两项操作将需要 5 至 90 分钟 该服务的主要使用者将是 ASP NET MVC
  • 创建/加入线程时隐式同步

    是什么minimal需要框架x考虑到创建 加入线程时隐含的同步 此代码的工作类型 std atomic volatile 没有什么 include
  • MySQL - 处理这种分层数据的最佳方法?

    这是以下内容的后续内容 MySQL 是否可以获取层次结构中的所有子项 我有一个任意深度邻接表模型表 我现在的情况是can将其转换为嵌套集合模型 我阅读了有关如何使用嵌套集合模型的 MySQL 数据 尽管执行插入 更新和删除等基本功能似乎变得