在数据库中实现可定制的树数据 struct (即具有未知级别数的树 struct )的最佳方法是什么?

在使用带有外键的表之前,我曾经这样做过一次.

您还看到了哪些其他实现,这种实现有意义吗?

推荐答案

您提到了最常用的实现方法,即邻接列表:

还有其他模型,包括materialized 路径和嵌套集:

Joe Celko写了一本关于这个主题的书,从一般SQL的Angular 来看,这是一本很好的参考书(在上面的嵌套集合文章链接中提到).

此外,伊兹克·本·甘恩在他的书《Microsoft SQL Server 2005内部:T-SQL查询》中对最常见的选项有很好的概述.

Select 模型时要考虑的主要因素是:

1) struct 变化的频率——树的实际 struct 变化的频率.一些模型提供了更好的 struct 更新特性.然而,将 struct 更改与其他数据更改分开是很重要的.例如,您可能希望对公司的组织 struct 图进行建模.有些人会将其建模为邻接列表,使用员工ID将员工链接到他们的主管.这通常是一种次优方法.一种通常效果更好的方法是将组织 struct 与员工本身分开建模,并将员工作为 struct 的一个属性进行维护.这样,当员工离开公司时,组织 struct 本身不需要改变,只需要与离开的员工建立联系.

2) 树是写重还是读重——有些 struct 在读取 struct 时工作得很好,但在写入 struct 时会产生额外的开销.

3) 你需要从 struct 中获取哪些类型的信息?有些 struct 擅长提供有关 struct 的特定类型的信息.示例包括查找 node 及其所有子 node 、查找 node 及其所有父 node 、查找满足特定条件的子 node 数等.您需要知道需要从 struct 中获取哪些信息,以确定最适合您需要的 struct .

Sql相关问答推荐

SQL -多个左外连接

优化SQL查询流

当有空单元格时,如何连接列

如何在SQL Server中列出从当前月份开始的过go 10年中的月份

使用`lag()`获取上一个时间戳

如何根据给定条件PostgreSQL迭代减少组中的行数

SQL -滞后于上一个非重复值

使用generate_series()时,LEFT联接缺少日期/间隔

SQL:查询作为子查询或CTE写入的最大和数失败

如何在SQL中从多个查询进行分组

改进的SQL子字符串提取

Proc SQL Select Distinct SAS

将二维数组的第一个和第二个元素取消嵌套到两个一维数组中

SQL SUM Filter逻辑解释

计算组内多个日期间隔go 年的累计天数

如何从postgresql中的项目映射(关联数组)设置值?

如何为给定的股票数据集计算利润/亏损,确保先卖出先买入的股票

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

自动生成计算频率的列

SQL日期比较用例;月初至今的报告