猿问
下载APP

SQL - 如何存储和导航层次结构?

SQL - 如何存储和导航层次结构?

您在数据库中建模和检索分层信息的方式有哪些?



隔江千里
浏览 63回答 3
3回答

一只甜甜圈

关于这个主题的权威部分是由Joe Celko编写的,他将其中的一些作品编写成了一本名为Joe Celko的树和层次结构的SQL for Smarties。他赞成一种称为有向图的技术。可在此处找到他关于此主题的工作介绍

Cats萌萌

我喜欢Modified Preorder Tree Traversal算法。这种技术使查询树变得非常容易。但是这里有一个关于这个主题的链接列表,我从Zend Framework(PHP)贡献者网页上复制了这个主题(由Laurent Melmoux发布于2007年6月5日15:52)。许多链接都是语言无关的:有两种主要的表示和算法来表示具有数据库的层次结构:嵌套集也称为修改前序树遍历算法邻接表模型这里有很好的解释:http://www.sitepoint.com/article/hierarchical-data-database在MySQL中管理分层数据http://www.evolt.org/article/Four_ways_to_work_with_hierarchical_data/17/4047/index.html以下是我收集的一些链接:http://en.wikipedia.org/wiki/Tree_%28data_structure%29http://en.wikipedia.org/wiki/Category:Trees_%28structure%29邻接表模型http://www.sqlteam.com/item.asp?ItemID=8866嵌套集http://www.sqlsummit.com/AdjacencyList.htmhttp://www.edutech.ch/contribution/nstrees/index.phphttp://www.phpriot.com/d/articles/php/application-design/nested-trees-1/http://www.dbmsmag.com/9604d06.htmlhttp://en.wikipedia.org/wiki/Tree_traversalhttp://www.cosc.canterbury.ac.nz/mukundan/dsal/BTree.html(applet java montrant le fonctionnement)Grapheshttp://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html课程:嵌套集DB树Adodbhttp://www.phpclasses.org/browse/package/2547.html访问模型ADOdbhttp://www.phpclasses.org/browse/package/2919.htmlPEAR :: DB_NestedSethttp://pear.php.net/package/DB_NestedSet利用率:https://www.entwickler.com/itr/kolumnen/psecom,id,26,nodeid,207.html梨树http://pear.php.net/package/Tree/download/0.3.0/http://www.phpkitchen.com/index.php?/archives/337-PEARTree-Tutorial.htmlnstreeshttp://www.edutech.ch/contribution/nstrees/index.php

12345678_0001

在SQL数据库中表示层次结构的最佳方法是什么?一种通用的便携式技术?我们假设层次结构主要是读取的,但不是完全静态的。让我们说这是一棵家谱。这是不怎么做:create table person (person_id integer autoincrement primary key,name      varchar(255) not null,dob       date,mother    integer,father    integer);并插入如下数据:person_id   name      dob       mother father  1           Pops      1900/1/1   null   null  2           Grandma   1903/2/4   null   null  3           Dad       1925/4/2   2      1  4           Uncle Kev 1927/3/3   2      15           Cuz Dave  1953/7/8   null   46           Billy     1954/8/1   null   3相反,将节点和关系拆分为两个表。create table person (person_id integer autoincrement primary key,name      varchar(255) not null,dob       date);create table ancestor (ancestor_id   integer,descendant_id integer,distance      integer);数据创建如下:person_id   name      dob       1           Pops      1900/1/1  2           Grandma   1903/2/4   3           Dad       1925/4/2   4           Uncle Kev 1927/3/35           Cuz Dave  1953/7/8   6           Billy     1954/8/1   ancestor_id  descendant_id  distance1            1              02            2              03            3              04            4              05            5              06            6              01            3              12            3              11            4              12            4              11            5              22            5              24            5              11            6              22            6              23            6              1现在,您可以运行不涉及将表连接回自身的仲裁查询,如果您在与节点相同的行中具有heirachy关系,则会发生这种情况。谁有祖父母?select * from person where person_id in     (select descendant_id from ancestor where distance=2);你所有的后代:select * from person where person_id in     (select descendant_id from ancestor     where ancestor_id=1 and distance>0);谁是叔叔?select decendant_id uncle from ancestor     where distance=1 and ancestor_id in     (select ancestor_id from ancestor         where distance=2 and not exists        (select ancestor_id from ancestor         where distance=1 and ancestor_id=uncle)    )您可以避免通过子查询将表连接到自身的所有问题,常见的限制是16个子查询。麻烦的是,维护祖先表有点难 - 最好用存储过程完成。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答