Database design 在树结构中检索父级和子级

Database design 在树结构中检索父级和子级,database-design,tree,Database Design,Tree,我已经使用嵌套集体系结构对数据库中的父子关系进行了建模 每个子项(叶子)都链接到一个包含开始日期的表,但父项不是 我希望能够检索在某个特定时间打开的所有叶子,以及它们的父级,如果父级的所有子级都打开了 有什么办法可以这么快完成吗?我想象着类似于发出子请求的事情,但这既不漂亮,也不快速;最好是在一个查询中完成 我是否可以将嵌套集体系结构更改为另一个体系结构,以便更容易生成此请求 编辑: 我使用的是MySql,但如果为了实现我的目标,必须使用MySql,我可以切换到任何其他数据库 这就是我的节点(父

我已经使用嵌套集体系结构对数据库中的父子关系进行了建模

每个子项(叶子)都链接到一个包含开始日期的表,但父项不是

我希望能够检索在某个特定时间打开的所有叶子,以及它们的父级,如果父级的所有子级都打开了

有什么办法可以这么快完成吗?我想象着类似于发出子请求的事情,但这既不漂亮,也不快速;最好是在一个查询中完成

我是否可以将嵌套集体系结构更改为另一个体系结构,以便更容易生成此请求

编辑:

我使用的是MySql,但如果为了实现我的目标,必须使用MySql,我可以切换到任何其他数据库

这就是我的节点(父-子)表的外观:

id (int)
lft (int)
rgt (int)
root_id (int , self reference to the root id, used to generate multi-rooted tree)
level (int)

name (string)
description (string)
...
id (int)
node_id (int)
start (datetime)
end (datetime)
status (bool, 0 for an opened date, 1 for a close one)
我的开始日期表如下所示:

id (int)
lft (int)
rgt (int)
root_id (int , self reference to the root id, used to generate multi-rooted tree)
level (int)

name (string)
description (string)
...
id (int)
node_id (int)
start (datetime)
end (datetime)
status (bool, 0 for an opened date, 1 for a close one)
我还补充说,我的父子关系不会经常改变,这就是为什么我决定采用嵌套集体系结构。
我的目标是在“选择查询”系统时尽可能快。

Af据我所知,MySQL不支持分层查询。使用Oracle非常简单,但对于MySQL,您可能需要为此创建存储函数。
试着阅读一下,据我所知,MySQL不支持分层查询。使用Oracle非常简单,但对于MySQL,您可能需要为此创建存储函数。
试着读一下

你能给我们看看你的表格结构吗?您使用的是哪种数据库管理系统?PostgreSQL?Oracle?一些问题:我假设您的节点表和
开始日期
表之间存在关系?节点表中使用的
root\u id
字段是什么?在
期初日期
表中使用的
状态
布尔字段是什么?我没有嵌套集的经验,但使用邻接模型(使用“parent_id”列)和支持递归查询的DBMS(例如PostgreSQL、Oracle和许多其他)可以很容易地解决这个问题.我的节点表通过节点id外键链接到开始日期。状态列包含0表示打开日期,1表示关闭日期。也许使用邻接模型“相当容易”,但需要选择打开的叶子,然后递归选择打开所有孩子的所有父母。这对我来说似乎很笨重,但也许这里没有其他选择。我要离开你问题的主题,但没有必要在
开始日期
表中设置
状态
字段。在日期字段中使用
NULL
,其中
start=NULL
:站点尚未打开<代码>开始空值和结束=空值
:站点打开<代码>结束空值
:站点关闭。那么就没有必要让状态字段保持最新。您能给我们看看您的表结构吗?您使用的是哪种数据库管理系统?PostgreSQL?Oracle?一些问题:我假设您的节点表和
开始日期
表之间存在关系?节点表中使用的
root\u id
字段是什么?在
期初日期
表中使用的
状态
布尔字段是什么?我没有嵌套集的经验,但使用邻接模型(使用“parent_id”列)和支持递归查询的DBMS(例如PostgreSQL、Oracle和许多其他)可以很容易地解决这个问题.我的节点表通过节点id外键链接到开始日期。状态列包含0表示打开日期,1表示关闭日期。也许使用邻接模型“相当容易”,但需要选择打开的叶子,然后递归选择打开所有孩子的所有父母。这对我来说似乎很笨重,但也许这里没有其他选择。我要离开你问题的主题,但没有必要在
开始日期
表中设置
状态
字段。在日期字段中使用
NULL
,其中
start=NULL
:站点尚未打开<代码>开始空值和结束=空值
:站点打开<代码>结束空值
:站点关闭。那么就没有必要让status字段保持最新。很可能这就是OP使用嵌套集模型的原因,它不需要分层查询这正是我使用嵌套集的原因,再加上我不喜欢分层查询,这很可能就是OP使用嵌套集模型的原因,它不需要分层查询,这正是我使用嵌套集的原因,再加上我不喜欢分层查询的原因。