SQL 中的分层标记

2023-11-26

我有一个 PHP Web 应用程序,它使用 MySQL 数据库进行对象标记,其中我使用了被接受为答案的标记结构这个问题.

我想实现一个标签层次结构,其中每个标签都可以有一个唯一的父标签。然后,搜索父标签 T 将匹配 T 的所有后代(即 T、父标签是 T(T 的子代)、T 的孙子等)。

最简单的方法似乎是在标签表中添加一个 ParentID 字段,其中包含标签的父标签的 ID,如果标签没有父标签,则添加一些幻数。然而,搜索后代需要重复对数据库进行全面搜索,以找到每个“一代”中的标签,这是我想避免的。

一种(大概)更快但不太标准化的方法是拥有一个包含每个标签的所有子代,甚至每个标签的所有后代的表。然而,这存在数据库中数据不一致的风险(例如,一个标签是多个父级的子级)。

有没有一种好方法可以让查询快速找到后代,同时保持数据尽可能规范化?


我使用两列来实现它。我在这里稍微简化了它,因为我必须将标签名称保留在单独的字段/表中,因为我必须将其本地化为不同的语言:

  • tag
  • path

例如,查看这些行:

tag            path
---            ----
database       database/
mysql          database/mysql/
mysql4         database/mysql/mysql4/
mysql4-1       database/mysql/mysql4-1/
oracle         database/oracle/
sqlserver      database/sqlserver/
sqlserver2005  database/sqlserver/sqlserver2005/
sqlserver2005  database/sqlserver/sqlserver2008/

etc.

使用like路径字段上的运算符您可以轻松获取所有需要的标记行:

SELECT * FROM tags WHERE path LIKE 'database/%'

有一些实现细节,例如当您移动层次结构中的节点时,您也必须更改所有子节点等,但这并不难。

还要确保路径的长度足够长 - 在我的例子中,我没有使用路径的标签名称,而是使用另一个字段来确保路径不会太长。

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

SQL 中的分层标记 的相关文章

随机推荐

  • shell脚本函数返回一个字符串

    我是 shell 脚本的新手 我正在尝试创建一个简单的函数 它将返回作为参数传递的连接的两个字符串 我尝试使用下面的代码 function getConcatenatedString echo String1 1 echo String2
  • linux 中的 ruby​​:永久“source .rvm/scripts/rvm”?

    我是 Ruby on Rails 的新手 刚刚按照我找到的说明在 Ubuntu Linux 中进行了设置here 具体来说 作为s m 说 我卸载了所有内容 然后我以普通用户身份打开了另一个终端会话并运行 bash s 稳定 https r
  • 大多数视频未从 YouTube 获取 VideoUrl

    我在用 https www youtube com get video info 获取视频信息 缩略图 视频URL 要在自定义视频播放器中播放视频 但当单击 vevo 频道 视频时 它不返回任何视频 URL 我还尝试了 get video
  • Javascript 中可以实现 OOP 吗?

    我最近发现Javascript函数可以有类 所以我想知道OOP是否也可以通过javascript实现 是吗 如果是 您能否指出一些教程或网站 我可以从哪里开始 OOP绝对是可能的 虽然 Javascript 不像大多数面向对象语言那样具有
  • 线程错误:尝试释放挂起的线程时句柄无效 (6)

    在给定的示例中 我在调用时收到异常AThread Free program Project44 APPTYPE CONSOLE uses SysUtils Classes Windows type TMyException class Ex
  • 使容器在包裹子元素时收缩以适合它们

    我试图弄清楚 Flexbox 如何工作 应该工作 对于如下情况 holder width 500px background lightgray display flex flex direction row justify content
  • numpy.savetxt 可以用于 N>2 的 N 维 ndarray 吗?

    我正在尝试使用 numpy savetxt 将 4D numpy float 数组输出到纯文本文件 然而 numpy 给出一个错误 说当我尝试传递这个数组时需要一个 float 参数 尽管如此 numpy 文档指定要传递的参数应该只是像数组
  • SVN 到 Clearcase 导出

    我有一位客户非常坚持使用 Clearcase 是否有任何工具 脚本可以让我的团队针对 SVN 存储库 或者实际上anything除了 Clearcase 之外 但会定期自动将变更集同步回 Clearcase VOB 我的想法是 如果存在这样
  • 将 python 中的嵌套列表中的每个元素从 string 转换为 int [重复]

    这个问题在这里已经有答案了 我有带有嵌套列表的 python 数据 其中一部分如下所示 data 214 205 0 14 710 1813494849 0 214 204 0 30 710 1813494856 0 214 204 0 3
  • 如何从 ast.FunctionDef 节点创建函数对象?

    我试图了解 python 代码的执行过程 假设源有一个函数定义 使用ast parse 我将其解析为一个 ast 其中将包含一个实例FunctionDef节点类 该节点实例不是可调用的 并且与函数对象不同 如何从这个 ast 创建函数对象及
  • Linq 异常:只能从 linq to 实体调用函数

    我有一个StudentReceipts存储的表ReceiptNo as string 001 002 003 099 我想要获取最后一张收据的详细信息 以便增加下一笔交易的收据编号 这是我尝试过的 var lastGeneratedRecD
  • 将html表导出到Excel javascript函数特殊字符已更改

    我有以下将 html 导出到 Excel 的函数 function generateexcel tableid var table document getElementById tableid var html table outerHT
  • 删除 Github 中的自定义域

    我想从 Github 中删除自定义域 请提供任何帮助 其实我想得到https myaseen208 github io DialelAnalysisR 而不是http www myaseen208 com DialelAnalysisR 如
  • 亿级记录批量插入

    将 2 37 亿条记录插入具有规则 用于跨子表分配数据 的表中的最快方法是什么 我曾经尝试过或考虑过 插入语句 事务性插入 BEGIN and COMMIT The COPY FROM命令 http pgbulkload projects
  • HTML5 CANVAS 绘制图像

    这是我的问题 我有点不明白下面函数中的 sx 和 sy 是什么意思 context drawImage 图像 sx sy sw sh dx dy dw dh 我真正的意思是 如果我们改变 sx 和 sy 的值 并将 dx 和 dy 设置为固
  • 从 HttpServletRequest 对象获取发布的 XML

    我有一个接收 HttpServletRequest 的过滤器 该请求是一个 POST 其中包含一个我需要读入过滤器方法的 xml 从 HttpServletRequest 对象获取发布的 xml 的最佳方法是什么 这取决于客户如何发送它 如
  • 尽管元组是不可变的,但它们在交互模式下存储在不同的地址中。为什么?

    t 1 2 3 t1 1 2 3 print id t print id t1 上面几行代码在Python中的脚本模式下给出了相同的地址 但在交互模式下它输出了不同的地址 谁能解释一下原因吗 当编译脚本时 编译器可以搜索所有等效的元组并生成
  • Vue.js 如何在 v-for 循环中使用单选按钮

    我正在尝试使用单选按钮 以便用户可以选择其中一张照片作为他们的个人资料照片 ul li div div div photo id p imgId div div div li ul
  • 如何在 R 中同时按两列对行进行排序?

    以下是根据 v2 列进行排名的代码 x lt data frame v1 c 2 1 1 2 v2 c 1 1 3 2 x rank1 lt rank x v2 ties method first 但我真的想根据 v2 和 然后 v1 进行
  • SQL 中的分层标记

    我有一个 PHP Web 应用程序 它使用 MySQL 数据库进行对象标记 其中我使用了被接受为答案的标记结构这个问题 我想实现一个标签层次结构 其中每个标签都可以有一个唯一的父标签 然后 搜索父标签 T 将匹配 T 的所有后代 即 T 父