处理数据库中的层次结构数据

2023-12-20

我很想知道在数据库设计方面处理层次结构的最佳方法(最佳实践)是什么。这是我通常如何处理它们的一个小例子。

节点表

NodeId int PRIMARY KEY
NodeParentId int NULL
DisplaySeq int NOT NULL
Title nvarchar(255)

祖先表

NodeId int
AncestorId int
Hops int

在 NodeId、AncestorId、Hops 上有索引

表格如下所示:

节点表

NodeId    NodeParentId    DisplaySeq    Title
1         NULL            1             'Root'
2         1               1             'Child 1'
3         1               2             'Child 2'
4         2               1             'Grandchild 1'
5         2               2             'Grandchild 2'

祖先表

NodeId    AncestorId    Hops
1         NULL          0
1         1             0
2         1             1
2         2             0
3         1             1
3         3             0
4         1             2
4         2             1
4         4             0
5         1             2
5         2             1
5         5             0

通过这种设计,我发现对于大型层次结构,我可以通过加入 AncestorId = 目标 NodeId 的 Ancestor 表来非常快速地获取层次结构的整个部分,例如:

SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId

获得直系孩子也很容易

SELECT *
FROM Node n
INNER JOIN Ancestor a on a.NodeId=n.NodeId
WHERE a.AncestorId = @TargetNodeId
AND Hops = 1

我有兴趣知道您可能还使用过哪些其他解决方案来解决此类问题。根据我的经验,层次结构可能会变得非常复杂,任何优化其检索的方法都非常重要。


有一些特定于供应商的扩展可以做到这一点,但我最喜欢的数据库中立方式来自 Joe Celko - 谷歌“Joe Celko Trees and Hierarchies”或购买这本书:链接文本 https://rads.stackoverflow.com/amzn/click/com/1558609202

这是一种非常聪明的基于集合的方法。易于查询层次结构。我添加了“parentID”字段,只是因为我经常询问“直接子代”和“父代”问题,这会加快这些问题的速度。但这是获取“祖先”或“后代”查询的好方法。

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

处理数据库中的层次结构数据 的相关文章

  • MS ACCESS 计数/求和行数,不重复

    我有下表 我需要计算总行数而不包括任何重复记录 CustomerID test1 test1 test2 test3 test4 test4 如您所见 总行数为 6 但有两个 test1 和两个 test4 我希望查询返回 4 IOW 我想
  • POINT 列上的 MySQL INSERT/UPDATE

    我正在尝试用我国家的地理位置填充我的数据库 我的一张表有 4 个字段 ID PK 纬度 经度和地理点 EDIT SCDBs Punto Geografico SET lat 18 469692 SET lon 63 93212 SET g
  • 如何找到多个列中的最小值

    我在我的 DB 3 col 中有一个值 我想在所有这些值中找到一个值 如下所述 表名 MyTable id col1 col2 col3 1 200 300 400 2 100 150 300 3 800 102 20 4 80 80 0
  • 在 PL/SQL 中将绑定变量与动态 SELECT INTO 子句结合使用

    我有一个关于 PL SQL 中的动态 SQL 语句中可以使用绑定变量的问题 例如 我知道这是有效的 CREATE OR REPLACE FUNCTION get num of employees p loc VARCHAR2 p job V
  • SQL 错误:“没有这样的表”

    我试图解决为什么我的代码为所有查询返回 null 的原因 最后发现 sql 查询什么也没有返回 我使用简约代码创建了一个新的 AIR 文档 s WindowedApplication
  • 给定“java.sql.SQLIntegrityConstraintViolationException”是否可以确定错误的列

    鉴于我有一个类型为 java sql SQLIntegrityConstraintViolationException 的异常 是否可以以编程方式确定错误的列 或多列 我问这个问题是因为我想将错误映射回客户端的数据模型以指示错误的字段 例如
  • date_sub 对于 mysql 可以,对于 postgresql 可以

    此查询适用于 mySQL 不适用于 Postgresql select from where id and h gt date sub now INTERVAL 30 MINUTE 错误是 Query failed ERREUR erreu
  • 如何在 DB2 AS/400 中将小数字段转换为日期字段?

    我有一个 DECIMAL 字段 其中包含 AS400 格式的日期 1100614 我努力了 cast MYDATE as DATE 但我无法将 DECIMAL 转换为 DATE 而 DATE MYDATE 返回空值 如何将此字段转换为日期字
  • Linq To SQL - 拥有和分组依据

    我下面这个查询工作正常 不过我想使用 Linq 来实现它 select u ID u NAME from Task t join BuildingUser bu ON bu ID BUILDING t ID BUILDING join Us
  • SQL:如何在按部分分组的查询中使用子查询?

    如何在按部分分组的查询中使用子查询 我使用 SQL Server 2008 R2 和 Delphi 2010 我收到此错误 Cannot perform an aggregate function on an expression cont
  • 如何搜索例程的内容/(SP-触发函数)

    我需要在数据库内所有例程的例程主体 存储过程 函数 触发器 中搜索文本 我该怎么做 Thanks SELECT OBJECT NAME object id FROM sys sql modules WHERE definition LIKE
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • JDBC插入实数数组

    我试图将一个真实的数组插入到 postgresql 数组中 该表的定义是 String sqlTable CREATE TABLE IF NOT EXISTS ccmBlock sampleId INTEGER block REAL 插入内
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • SQL Server 连接其他表中不存在的位置

    Service Asset AssetService Id Name Id Name AssetId ServiceId
  • 从 Getdate() 获取时间

    我想采取Getdate 结果 例如 2011 10 05 11 26 55 000 into 11 26 55 AM 我看过其他地方并发现 Select RIGHT CONVERT VARCHAR GETDATE 100 7 这给了我 11
  • 我不断收到错误“关系 [TABLE] 不存在”

    我一直在尝试查询数据库中的两个表 在服务器资源管理器中 我可以看到两个表 甚至可以看到其中的列 我们将它们称为 Schema table1 和 Schema table2 其中 Schema 的第一个字母大写 我尝试运行以下查询 selec
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 使用加权行概率从 PostgreSQL 表中选择随机行

    输入示例 SELECT FROM test id percent 1 50 2 35 3 15 3 rows 你会如何编写这样的查询 平均 50 的时间我可以获得 id 1 的行 35 的时间 id 2 的行 15 的时间 id 3 的行
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装

随机推荐

  • 如何将压缩的 (gz) CSV 文件读入 dask Dataframe 中?

    有没有办法读取通过 gz 压缩到 dask 数据帧中的 csv 文件 我直接尝试过 import dask dataframe as dd df dd read csv Data gz 但出现 unicode 错误 可能是因为它正在解释压缩
  • 调用方法后按钮变量变为 null

    在我的主要活动中 我有以下片段 MainActivity class private Button btnx10 Override protected void onCreate Bundle savedInstanceState supe
  • Font Awesome、Bootstrap 和屏幕阅读器辅助功能

    我想知道使用 Twitter Bootstrap 框架和 FontAwesome 图标字体的屏幕阅读器可访问性 我正在考虑两种不同的图标情况 1 该图标具有屏幕阅读器将拾取的帮助文本 a href class btn btn default
  • 为什么 Visual Studio 2008 在 Firefox 中运行缓慢?

    我正在使用 Microsoft Visual Web Developer 2008 Express 我创建了一个 ASP NET MVC 站点 其中 Site Master 文件的 HEAD 元素中有 6 个 CSS 文件和 6 个 Jav
  • 如何使用开始/停止谓词对列表的连续元素进行分组?

    假设我有一个类似的列表 def data a b c d e f g h b d x 和谓词如 defn start x x b defn stop x x d 标记子序列的第一个和最后一个元素 我想返回一个包含子组的列表 如下所示 par
  • 有什么方法可以控制 SqlEntityConnection 上的 AutoDetectChanges 吗?

    本文 http ilmatte wordpress com 2013 01 01 entity framework code first always disable autodetectchanges when importing dat
  • C# EF Linq 按位问题

    好的 例如 我按位使用如下 星期一 1 星期二 2 星期三 4 星期四 8 等 我正在使用业务实体框架类 我正在使用一个类并传递一个像 7 这样的值 星期一 星期二 星期三 我想返回与这些日子匹配的记录 public List
  • C# 回调接收UTF8字符串

    我有一个 C 函数 一个回调 从用 C 编写的 Win32 DLL 调用 调用者给了我一个UTF8字符串 但我无法正确接收它 所有匈牙利特殊字符都出错了 UnmanagedFunctionPointer CallingConvention
  • 如何在ionic 2/3中处理数据库异步操作

    我正在 ionic 中使用数据库 我调用一个 API 该 API 返回一些记录 我必须将这些记录插入数据库以及插入操作何时完成then我想从数据库中调用选择记录 问题是异步行为 在插入操作完成之前调用从数据库中选择记录 谁能帮我解决这个问题
  • 在 PHP 中验证电子邮件地址[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 PHP 中验证电子邮件地址 https stackoverflow com questions 12026842 how to validate an emailaddress in php
  • 如何按工作日顺序(如日历周)而不是按字母顺序(在 C# 中)排序?

    我无法弄清楚如何按日期对独立存储中的 XML 文件中的查询输出进行排序 该日期是 xml 文件中的值 我的意思是它将按当天的第一个字母排序 因此它将返回星期五作为第一个字母 因为其中有 F 但这不是我想要的 相反 它们应该按工作日的顺序排序
  • 从 File.OpenRead() 返回流

    我正在编写一个 WCF 服务 该服务将允许 ASP Net 网站检索文件 基于本文 http msdn microsoft com en us library ms789010 aspx Y912 我的问题是 当我返回流时 它是空白的 为简
  • WordPress wp_localize_script 是做什么的? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以解释一下吗wp localize script 做 即使我在 WP Codex 中读过它 我一开始也不明白它的作用 它允许您通过打
  • 如何在使用插件时将域添加到 next.config.js 的“next/image”

    这是我当前的设置 next config js const withImages require next images module exports withImages webpack config options return con
  • 使用 Promise 在 Node.js + Express 中进行错误处理

    使用 Node js Express 4 Mongoose 使用 Promise 而不是回调 我不知道如何整理我的错误处理 我得到的 相当简化的 是 app get xxx id function request response Xxx
  • 使用reduce在Javascript中构建过滤函数

    在一次采访中 有人向我提出了一个让我摸不着头脑的问题 我不想花周末担心结果 而是想尝试解决问题 但我无法弄清楚 使用下面的reduce函数 构建一个过滤函数 该函数将一个数组和一个测试函数作为参数 并返回一个新数组 该数组已根据测试函数过滤
  • SQL ORDER BY(序列)[重复]

    这个问题在这里已经有答案了 我有一个我想要的sql语句ORDER BY特定的顺序 SELECT FROM UserDB ORDER BY Role 我怎样才能将数据带到我的GridView表从顶部的 管理员 列出 然后是 用户 和 来宾 所
  • 如何在程序中获取 _GLOBAL_OFFSET_TABLE_ 地址?

    我想在我的程序中获取 GLOBAL OFFSET TABLE 的地址 一种方法是使用nm http linux about com library cmd blcmdl1 nm htmLinux 中的命令 可能会将输出重定向到文件并解析该文
  • 传递结构数组时遇到问题

    我一生都无法弄清楚如何在整个程序中传递这个结构数组 有人可以帮忙吗 现在我在 main 中收到一个错误 内容是 标记之前预期的主要表达式 Header ifndef HEADER H INCLUDED define HEADER H INC
  • 处理数据库中的层次结构数据

    我很想知道在数据库设计方面处理层次结构的最佳方法 最佳实践 是什么 这是我通常如何处理它们的一个小例子 节点表 NodeId int PRIMARY KEY NodeParentId int NULL DisplaySeq int NOT