`

MySql无限分类数据结构

阅读更多

无限分类是我们开发中非常常见的应用,像论坛的的版块,CMS的类别,应用的地方特别多。
我们最常见最简单的方法就是在MySql里ID ,parentID,name:
优点是简单,结构简单。
缺点是效率不高,因为每一次递归都要查询数据库,几百条数据库时就不是很快了!

存储树是一种常见的问题,多种解决方案。主要有两种方法:邻接表的模型,并修改树前序遍历算法。

我们将探讨这两种方法的节能等级的数据。我会使用树从一个虚构的网上食品商店作为一个例子。这食品商店组织其食品类,通过颜色和类型。这棵树看起来像这样:

下面我们将用另外一种方法,这就是预排序遍历树算法(modifiedpreordertreetraversalalgorithm)
这种方法大家可能接触的比较少,初次使用也不像上面的方法容易理解,但是由于这种方法不使用递归查询算法,有更高的查询效率。
我们首先将多级数据按照下面的方式画在纸上,在根节点Food的左侧写上1然后沿着这个树继续向下在Fruit的左侧写上2然后继续前进,沿着整个树的边缘给每一个节点都标上左侧和右侧的数字。最后一个数字是标在Food右侧的18。在下面的这张图中你可以看到整个标好了数字的多级结构。(没有看懂?用你的手指指着数字从1数到18就明白怎么回事了。还不明白,再数一遍,注意移动你的手指)。
这些数字标明了各个节点之间的关系,"Red"的号是3和6,它是"Food"1-18的子孙节点。同样,我们可以看到所有左值大于2和右值小于11的节点都是"Fruit"2-11的子孙节点

如图所示:


这样整个树状结构可以通过左右值来存储到数据库中。继续之前,我们看一看下面整理过的数据表。

注意:由于"left"和"right"在SQL中有特殊的意义,所以我们需要用"lft"和"rgt"来表示左右字段。另外这种结构中不再需要"parent"字段来表示树状结构。也就是说下面这样的表结构就足够了。

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11;


看到了吧,只要一个查询就可以得到所有这些节点。为了能够像上面的递归函数那样显示整个树状结构,我们还需要对这样的查询进行排序。用节点的左值进行排序:

SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;

那么某个节点到底有多少子孙节点呢?很简单,子孙总数=(右值-左值-1)/2
descendants=(right–left-1)/2,如果不是很清楚这个公式,那就去翻下书,我们在上数据结构写的很清楚!

添加同一层次的节点的方法如下:

LOCKTABLEnested_categoryWRITE;


SELECT@myRight:=rgtFROMnested_category
WHEREname='Cherry';



UPDATEnested_categorySETrgt=rgt+2WHERErgt>@myRight;
UPDATEnested_categorySETlft=lft+2WHERElft>@myRight;

INSERTINTOnested_category(name,lft,rgt)VALUES('Strawberry',@myRight+1,@myRight+2);

UNLOCKTABLES;

添加树的子节点的方法如下:

LOCKTABLEnested_categoryWRITE;

SELECT@myLeft:=lftFROMnested_category

WHEREname='Beef';

UPDATEnested_categorySETrgt=rgt+2WHERErgt>@myLeft;
UPDATEnested_categorySETlft=lft+2WHERElft>@myLeft;

INSERTINTOnested_category(name,lft,rgt)VALUES('charqui',@myLeft+1,@myLeft+2);

UNLOCKTABLES;

每次插入节点之后都可以用以下SQL进行查看验证:

SELECTCONCAT(REPEAT('',(COUNT(parent.name)-1)),node.name)ASname
FROMnested_categoryASnode,
nested_category
ASparent
WHEREnode.lftBETWEENparent.lftANDparent.rgt
GROUPBYnode.name
ORDERBYnode.lft;

删除节点的方法,稍微有点麻烦是有个中间变量,如下:
LOCKTABLEnested_categoryWRITE;


SELECT@myLeft:=lft,@myRight:=rgt,@myWidth:=rgt-lft+1
FROMnested_category
WHEREname='Cherry';


DELETEFROMnested_categoryWHERElftBETWEEN@myLeftAND@myRight;


UPDATEnested_categorySETrgt=rgt-@myWidthWHERErgt>@myRight;
UPDATEnested_categorySETlft=lft-@myWidthWHERElft>@myRight;

UNLOCKTABLES;

这种方式就是有点难的理解,但是适合数据量很大规模使用,查看所有的结构只需要两条SQL语句就可以了,在添加节点和删除节点的时候略显麻烦,不过相对于效率来说还是值得的,这次发现让我发现了数据库结构真的很有用,但是我在学校学的树基本上都忘记了,这次遇到这个问题才应用到项目中!

参考文章:
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html

http://www.sitepoint.com/article/hierarchical-data-database/3/
分享到:
评论

相关推荐

    MySql无限分类结构与数据组树型菜单

    MySql无限分类结构与数据组树型菜单MySql无限分类结构与数据组树型菜单

    mysql 无限级分类实现思路

    MySQL 实现无限级分类是一种常见的数据库设计挑战,特别是在需要构建层级结构的数据模型时,例如网站导航菜单、组织架构或商品分类。以下将详细介绍三种常见的无限级分类实现方法,并分析其优缺点。 ### 1. 递归...

    ajax php mysql 无限级分类

    在IT行业中,无限级分类是一种常见的数据组织方式,特别是在电商网站、内容管理系统等场景下,用于构建层次清晰的目录结构。本项目结合了Ajax、PHP和MySQL技术来实现这一功能,下面将详细介绍这三个技术在无限级分类...

    PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例

    在构建树型结构数据,例如在PHP和MySQL的环境下实现无限分类,有两种常见的方法:领接表(Adjacency List)和预排序遍历树(Modified Preorder Tree Traversal,MPTT)。这两种方法各有优缺点,适用于不同的场景。 ...

    php+mysql无限分类

    总的来说,"php+mysql无限分类"涉及的知识点包括: - PHP编程基础,尤其是函数递归的应用。 - MySQL数据库设计,特别是如何构建支持无限分类的表结构。 - 数据库查询语言SQL,如SELECT、INSERT、UPDATE、DELETE等...

    php+mysql无限分类源码

    在这个场景下,我们关注的是一个名为"php+mysql无限分类源码"的项目。这个源码实现了在PHP后端与MySQL数据库交互时创建无限级别的分类系统。以下是关于这个主题的详细解释。 首先,PHP是一种广泛使用的服务器端脚本...

    mysql无限级别树形菜单操作(附加JSP新闻发布系统)

    这个案例中的"mysql无限级别树形菜单操作"展示了如何利用存储过程来实现这一功能,特别是在一个新闻发布系统中,这样的数据结构非常常见,用于构建层次分明的新闻分类。 首先,我们要理解无限级别树形菜单的数据...

    php mysql数据库无限分类类库.zip

    这是一个php无限分类代码,比较完整理包括了数据库是mysql的,有增加、删除、编辑、移动的功能,同时还提供数据库sql表结构。需要的朋友可以参考下,方便大家学习php。

    SQL2005动态表无限级分类存储过程

    在SQL Server 2005中,动态表无限级分类是一种常见的数据建模技术,用于构建具有层级关系的数据结构,例如组织结构、产品目录或菜单系统。这些层级关系可以通过自引用的方式实现,其中每个记录都有一个父记录的引用...

    无限级分类/多级分类【左右值方式实现】

    因此,在设计和实现无限级分类时,需要权衡性能和复杂性,合理选择合适的数据结构和算法。 在实际应用中,除了左右值法,还有其他实现无限级分类的方法,如路径枚举法、预排序遍历树(PreOrder Traversal Tree, ...

    php+mysql数据库无限分类类库

    设计合理的数据结构对于实现无限分类至关重要。 3. **PHP类库**:这个类库可能包含一个或多个PHP类,用于操作分类数据。这些类可能包括添加新分类、删除分类、编辑分类以及移动分类到其他父分类的方法。 4. **SQL...

    php+mysql数据库无限分类库

    无限分类库的关键在于设计一个能够存储层级关系的数据结构,并通过有效的查询方式来处理这些关系。 1. 数据库设计: 在MySQL中,通常会使用自引用的方式创建无限分类表。这意味着表中有一个字段(如`parent_id`)...

    java实现无限级分类树形,连接mysql数据库

    5. 数据结构与算法(构建树形结构) 6. 前后端交互(RESTful API) 7. AJAX异步刷新 8. 前端树形菜单渲染 通过以上步骤,你可以实现一个能够连接MySQL数据库,支持无限级分类的Java树形菜单,并且利用AJAX实现页面...

    漂亮的无限级分类 | 无限级分类 | 无限级管理 | 无限级样式 |多级分类

    例如,在“JohnTree.sln”这个解决方案中,可能包含了处理无限级分类的C#代码,用于构建和操作这样的数据结构。 "JohnTree.Library"可能是项目中的一个库,封装了无限级分类的业务逻辑和数据访问层,提供了方便的...

    php无限级分类 无限级分类

    非递归方法通常基于预计算,如使用路径法(在每个分类中存储完整的路径,如“0->1->2”),或者利用栈/队列数据结构进行遍历。这种方法在处理大量数据时性能更好,但实现起来稍复杂。 `conn.php`文件通常用于...

    php+mysql实现无限级分类

    这里提出一种新的方案:在MySQL表中新增一个字段,用来记录分类的层级结构,例如: ```sql CREATE TABLE `w_faqclass` ( `id` int(11) NOT NULL AUTO_INCREMENT, `pid` int(11) NOT NULL DEFAULT '0', `xid` int...

    PHP递归写入MySQL实现无限级分类数据操作示例

    PHP递归写入MySQL无限级分类数据,表结构: CREATE TABLE `kepler_goods_category` ( `id` int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT, `parentid` int unsigned NOT NULL default 0 comment '父级分类ID...

    无限级分类无限级分类无限级分类无限级分类

    根据提供的信息,我们可以了解到这份资料主要涉及的是一个数据库表结构定义和一段PHP代码,用于实现无限级...通过合理的数据结构设计和代码实现,可以有效地管理大量的分级数据,并且使得数据的维护变得更加简单高效。

    php与mysql实现无线分类

    总结来说,PHP与MySQL实现无线分类的关键在于设计合适的数据结构和算法,以及编写相应的查询和操作逻辑。通过熟练掌握这些技巧,开发者可以构建出灵活、可扩展的分类系统,满足各种复杂的业务需求。

Global site tag (gtag.js) - Google Analytics