当前位置: 首页 > 面试题库 >

有效而轻松地实现等级制,父母/子女关系

谷梁宝
2023-03-14
问题内容

我有一张桌子

create table site
(
site_Id int(5),
parent_Id int(5),
site_desc varchar2(100)
);

领域的意义:

  • site_Id:网站的ID
  • parent_Id:站点的父ID
  • site_desc:尽管与问题无关,但是具有站点的描述

要求是,如果我有一个site_id作为输入,并且需要该网站下方标记的所有ID。例如:

                    A
                   / \
                  B   C
                / | \ /\
               D  E F G H
              /\
             I  J

所有节点都是site_Id。

该表包含如下数据:

Site_id  | Parent_ID  |  site_desc
_________|____________|___________
 A       |   -1       |   
 B       |    A       |
 C       |    A       |
 D       |    B       |
 E       |    B       |
 F       |    B       |
 I       |    D       |
 J       |    D       |

......

A是B和C的父代,依此类推。

如果B是给定的输入,则查询需要获取D,E,I,F,J

目前,它是通过循环中的多个查询来实现的,但我当时正在考虑以最少数量的查询来实现。

我目前正在做的是:

否决

该算法是这样的:

Initially create a data set object which you will populate, by fetching data from the data base. 
Create a method which takes the parent id as parameter and returns its child nodes if present, and returns -1, if it doesnt have a child. 
Step1: Fetch all the rows, which doesn't have a parent(root) node. 
Step2: Iterate through this result. For example if prod1 and prod2 are the initial returned nodes, in the resultset. 
Iterating this RS we get prod1, and we insert a row in our DataSET obj. 
Then we send the id of prod1 to getCHILD method, to get its child, and then again we iterate the returned resultset, and again call the getCHILD method, till we dont get the lowest node.

我需要在数据模型约束内的最佳优化技术。如有任何建议,请随时回答。
请提出任何建议。提前致谢。


问题答案:

不幸的是,如果您无法更改数据模型,并且使用的是MySQL,则将陷入需要递归查询并且使用不支持递归查询的DBMS的局面。

Quassnoi写了一系列有趣的博客文章,展示了查询分层数据的技术。他的解决方案非常聪明,但是非常复杂。
http://explainextended.com/2009/03/17/hierarchical-queries-in-
mysql/

PostgreSQL是另一个开源RDBMS,它确实支持递归查询,因此您可以按照显示的方式获取整棵树。但是,如果您不能更改数据模型,则假定您无法切换到其他RDBMS。

有几种可供选择的数据模型,它们使得获取任意深的树变得更加容易:

  • 封闭表
  • 嵌套集又称为修改后的预序树遍历
  • 路径枚举又称实体化路径

我将在我的演示文稿“ 使用SQL和PHP的层次数据模型”中以及在《SQL反模式:避免数据库编程的陷阱》一书中介绍这些内容。

最后,在Slashdot的代码中,我看到了另一个解决方案,用于它们的注释层次结构:它们像在“邻接表”中一样存储“
parent_id”,但它们还存储“
root_id”列。给定树的每个成员具有相同的root_id值,root_id是其树中的最高祖先节点。然后,很容易在一个查询中获取整棵树:

SELECT * FROM site WHERE root_id = 123;

然后,您的应用程序将所有节点从数据库中取回一个数组,并且您必须编写代码以遍历该数组,将节点插入内存中的树数据结构中。如果您有许多单独的树,并且每棵树都有相对较少的条目,那么这是一个很好的解决方案。这对Slashdot的案子很有好处。



 类似资料:
  • 问题内容: 我正在学习SQL,并具有一些类似于以下内容的表: (*表示主键,如果是Customer和Employee,则既是PK又是返回给Person的FK) Customer和Employee都是Person的类型,我想确保在将记录插入Person时,也必须将记录插入EITHER Customer或Employee,但不能同时插入两者。在此示例的限制范围内,人员不能同时是雇员和客户。 有人告诉我

  • 问题内容: 使用Spring和Hibernate,我可以在自引用类的父级/子级和另一个类之间实现一对多关系。也就是说,这是自引用类: D B: 模型: 现在,我想为父母/孩子(经理/雇员)和另一个这样的类创建一对多的关系: 因此,经理和员工都将与一个或多个课程相关联。课程课程: 这是我要实现的内容的概述,但我想知道这是否可能,如果可以,如何在数据库关系中进行设置,并能够通过hibernate将关系

  • 本文向大家介绍jQuery轻松实现无缝轮播效果,包括了jQuery轻松实现无缝轮播效果的使用技巧和注意事项,需要的朋友参考一下 这个无缝轮播和那个图片平滑滚动的原理差不多。 原理:ul向左滚动,滚动一次,第一个li向ul插入,然后在让怎个ul的left值为0,也就是初始状态,这个状态太快我们无法看到,所以才会有平滑滚动的效果 //CSS //HTML //JQUERY 以上就是本文的全部内容,希望

  • 问题内容: 有两个SQL表: 我想用单个查询从Parents表中选择每一行,并从Childs表中为具有关系“ parent”-“ id”值和最大“ feature”列值的每一行选择一个查询。在此示例中,结果应为: 其中p =父表,c =子表 我试图离开外部联接和GROUP BY,但是MSSQL Express告诉我,使用GROUP BY进行查询需要在每个非Groupped字段上使用聚合函数。而且我

  • 本文向大家介绍轻松实现jquery选项卡切换效果,包括了轻松实现jquery选项卡切换效果的使用技巧和注意事项,需要的朋友参考一下 很早之想就学习jquery的插件写法,一直拖到现在,今天趁着没什么工作忙,搜索些资料学习下,写了个比较简单的选项卡效果。 刚开始有看到一个很通俗易通的例子:alert对话框。 jquery.alertMsg.js 调用方式: jQuery插件结构 选项卡实现: 1、H

  • 问题内容: 我有一个这样的表: 我想创建一个有序的表单,如下所示: 在数据库中,有很多书,而不仅仅是一本书。 有没有办法以这种方式对查询“ SELECT”进行排序?这只是一个表面问题,不需要做多维数组之类的事情,因为我可以在标签上贴上它们的类型,然后根据类型更改它们的外观。但是我需要以正确的顺序查找查询。 PD:对不起,我的英语:S 问题答案: 不要以为数据库是个好主意。查询将很难。Imo更好-您