top of page
Search

Handling Hierarchical Data in MySQL Via Adjacency List Model

In this blog, you will study how to use adjacency list model for handling hierarchical data in MySQL.


Overview to adjacency list model


Hierarchical data is all over. It can be blog categories, product orders, or organizational structures.


There are several ways to manage hierarchical data in MySQL and the adjacency list model may be the modest solution. Because of its ease, the adjacency list model is a very popular optimal by developers and database administrators.


In the adjacency list model, each node has a pointer that points to its parent. The top node has no parent. See the subsequent categories of electronics products:



There are about terms that you should be aware with before you work with the adjacency list model:


  • Electronics is a top node or root node.

  • Laptops, Cameras & photo, Phones & Accessories nodes are the children of the Electronics node. And vice versa Electronics node is the parent of Laptops, Cameras & photo, Phones & Accessories nodes.

  • The leaf nodes are the nodes that have no children e.g., Laptops, PC, Android, iOS, etc while the non-leaf nodes are the ones that have at least one child.

  • The children and grandchildren of a node are called descendants. And the parents, grandparents, etc., of a node are also known as ancestors.

To model this category tree, we can create a table named category with three columns: id, title, and parent_id as follows:


Each row in a table is a node in the tree identified by the id column. The parent_id column is the foreign key of the category table itself. It acts like a pointer that points to the id column.


Inserting data


The root node of the tree has no parent, then, the parent_id is set to NULL. The other nodes must have one and only one parent.


To insert a root node, you set the parent_id to NULL as follows:



To insert a non-root node, you just want to set its parent_id to the id of its parent node. For example, the parent_id of Laptop & PC, Cameras & Photos and Phone & Accessories nodes are set to 1:


Finding the root node


The root node is the node that has no parent. In other words, its parent_id is NULL:


Finding the immediate children of a node


The following query gets the direct children of the root node:


Finding the leaf nodes


The leaf nodes are the nodes that have no children.


Querying the whole tree


The subsequent recursive common table expression (CTE) retrieves the whole category tree. Notice that the CTE feature has been offered since MySQL 8.0


Querying a sub-tree


The subsequent query gets the sub-tree of Phone & Accessories whose id is 7.


Querying a single path


To query a single path from bottom to top e.g., from iOS to Electronics, you use the subsequent statement:


Calculating level of each node


Suppose the level of the root node is 0, each node below has a level that equals its parent node’s level plus 1.


Deleting a node and its descendants


To delete a node and its descendants, just remove the node itself, all the descendants will be deleted automatically by the DELETE CASCADE of the foreign key constraint.


For example, to delete the Laptops & PC node and its children (Laptops, PC), you use the subsequent statement:


Deleting a node and promote its descendants


To delete a non-leaf node and promote its descendants:


  • First, update the parent_id of the immediate children of the node to the id of the new parent node.

  • Then, delete the node.


For example, to delete the Smartphones node and promote its children such as Android, iOS, Other Smartphones nodes:


First, update the parent_id for all direct children of Smartphones:


Second, delete the Smartphones node:


Both statements should be wrapped in a single transaction:


Moving a subtree


To move a subtree, just update the parent_id of the top node of the subtree. For example, to move the Cameras & photo as the children of Phone and Accessories, you use the following statement:


In this blog, you have educated how to use the adjacency list model to manage hierarchical data in MySQL.

94 views0 comments

Recent Posts

See All

What are the future prospects of Java

According to a survey conducted, nearly 63% programmers mentioned that they will likely continue to work with Java along with coding with Python, SQL and HTML/CSS. In addition, the giants in the corpo

Deleting Duplicate Rows in MySQL

In this blog, you will study several ways to delete duplicate rows in MySQL. In this blog, I have shown you how to find duplicate values in a table. Once the duplicates rows are recognized, you may ne

Upload Data to MySQL tables using mysqlimport

Uploading quite a lot of rows of data from a text, csv, and excel file into a MySQL table is a repetitive task for sysadmins and DBAs who are handling MySQL database. This blog clarifies 4 applied exa

bottom of page