A Nested Set is a data structure used to store hierarchical data, such as tree structures (e.g., organizational hierarchies, category trees), in a flat, relational database table. This method provides an efficient way to store hierarchies and optimize queries that involve entire subtrees.
Left and Right Values: Each node in the hierarchy is represented by two values: the left (lft) and the right (rgt) value. These values determine the node's position in the tree.
Representing Hierarchies: The left and right values of a node encompass the values of all its children. A node is a parent of another node if its values lie within the range of that node's values.
Consider a simple example of a hierarchical structure:
1. Home
1.1. About
1.2. Products
1.2.1. Laptops
1.2.2. Smartphones
1.3. Contact
This structure can be stored as a Nested Set as follows:
ID | Name | lft | rgt |
1 | Home | 1 | 12 |
2 | About | 2 | 3 |
3 | Products | 4 | 9 |
4 | Laptops | 5 | 6 |
5 | Smartphones | 7 | 8 |
6 | Contact | 10 | 11 |
Finding All Children of a Node: To find all children of a node, you can use the following SQL query:
SELECT * FROM nested_set WHERE lft BETWEEN parent_lft AND parent_rgt;
Example: To find all children of the "Products" node, you would use:
SELECT * FROM nested_set WHERE lft BETWEEN 4 AND 9;
Finding the Path to a Node: To find the path to a specific node, you can use this query:
SELECT * FROM nested_set WHERE lft < node_lft AND rgt > node_rgt ORDER BY lft;
Example: To find the path to the "Smartphones" node, you would use:
SELECT * FROM nested_set WHERE lft < 7 AND rgt > 8 ORDER BY lft;
The Nested Set Model is particularly useful in scenarios where data is hierarchically structured, and frequent queries are performed on subtrees or the entire hierarchy.