SlideShare una empresa de Scribd logo
1 de 32
Descargar para leer sin conexión
Trees and Hierarchies in SQL
       by Eduard Hildebrandt
In most projects we have to deal with
       some kind of trees or hierarchies!

Think about…
   • Categories
   • Organisation
   • Threads
   • Folders
   • Components
   •…
How can we store an retrieve trees and hierarchies
     effenciently from relational databases?
Agenda

• Adjacency List Model
• Closure Table Model
• Path Enumeration Model
• David Chandler Model
• Modified David Chandler Model
• Nested Set Model
• Hyprid Model
• Frequent Insertion in Nested Sets
What is a „tree“?
A tree is a connected, undirected, acyclic grap.



                                               A

                                   B                   C

                        D          E               F       G   H

                                                   I
What is a „tree“?
A tree is a connected, undirected, acyclic grap.



                                               A

                                   B                   C

                        D          E               F       G   H

                                                   I           X
What is a „tree“?
A tree is a connected, undirected, acyclic grap.



                                               A

                                   B                   C

                        D          E               F       G   H

                                                   I
What is a „tree“?
A tree is a connected, undirected, acyclic grap.



                                               A

                                   B                   C

                        D          E               F       G   H

                                                   I
Adjacency List Model
                                       A

                           B                   C

                 D         E               F       G      H

                                           I
title   parent   Creating the table:
                 CREATE TABLE nodes
 A       null       (title VARCHAR(255) NOT NULL PRIMARY KEY,
 B        A         parent VARCHAR(255));

 C        A      Finding the root node:
 D        B      SELECT *
                    FROM nodes
 E        B         WHERE parent IS NULL;
 F        C
                 Finding the leaf nodes:
 G        C
                 SELECT node1.*
 H        C         FROM nodes AS node1
                    LEFT JOIN node AS node2 ON node1.title = node2.parent
  I       F         WHERE node2.title = ‘A’;
Adjacency List Model
                           UPDATE anomalies
                                     A

                          B                   C

                 D        E              F        G   H

title   parent                           I
 A       null        UPDATE nodes
                        SET title = ‘X’
 B        A             WHERE title = ‘C’;
 C        A
 D        B          START TRANSACTION;
                     UPDATE nodes
 E        B             SET title = ‘X’
                        WHERE title = ‘C’;
 F        C          UPDATE nodes
 G        C             SET parent = ‘X’
                        WHERE parent = ‘C’;
 H        C          COMMIT;

  I       F
Adjacency List Model
                          INSERT anomalies
INSERT INTO nodes (title, parent) VALUES
 (‘X’, ‘Y’),                                         X            Y
 (‘Y’, ‘X’);



INSERT INTO nodes (title, parent) VALUES                   X
 (‘X’, ‘X’);


Parent must exist:
ALTER TABLE nodes ADD CONSTRAINT parent_fk FOREIGN KEY (parent)
      REFERENCES nodes (id);

Node can not be it‘s own parent:
CHECK (title <> parent)

Prevent double connections:
UNIQUE (title, parent)

Connected graph (edges = nodes – 1):
CHECK ((SELECT COUNT(*) FROM nodes) – 1
        = SELECT COUNT(parent) FROM nodes;

One root only:
CHECK ((SELECT COUNT(*) FROM nodes WHERE parent IS NULL) = 1);
Adjacency List Model
                   DELETE anomalies


DELETE FROM nodes WHERE title = ‘C’;


                        A

              B                 C

    D         E             F          G   H

                            I
Adjacency List Model
                          DELETE anomalies


              What happens with nodes F, G, H and I?

                               A

                    B                        ?
          D         E              F         G         H

                                   I


ALTER TABLE nodes ADD CONSTRAINT parent_fk FOREIGN KEY (parent)
      REFERENCES nodes (id)
      ON DELETE ...;
Adjacency List Model
          DELETE anomalies


     Solution 1: delete all children

                A

    B                     C

D   E                F          G      H

                     I
Adjacency List Model
                DELETE anomalies


Solution 2: move children to the level of the parent

                        A

          B         F          G         H

D         E         I
Adjacency List Model
                 DELETE anomalies


    Solution 3: replace parent with the first child

                       A

           B                     F

D          E          I          G          H
Adjacency List Model
                           with self -references
                                       A

                           B                       C

                 D         E               F           G       H


title   parent
                                            I
 A        A      Creating the table:
                 CREATE TABLE nodes
 B        A         (title VARCHAR(255) NOT NULL PRIMARY KEY,
                    parent VARCHAR(255) NOT NULL);
 C        A
 D        B
 E        B                Avoids NULL in the parent column!
 F        C
 G        C
 H        C
  I       F
Path Enumeration Model
                                        A

                            B                   C

                  D         E               F       G      H

                                            I
title    path     Creating the table:
                  CREATE TABLE nodes
 A        A          (title VARCHAR(255) NOT NULL PRIMARY KEY
 B       A/B          -- don’t use a separater in primary key
                      CHECK (REPLACE (title, ‘/’, ‘’) = title,
 C       A/C         path VARCHAR(1024) NOT NULL);

 D      A/B/D
 E      A/B/E
 F      A/C/F
 G      A/C/G
 H      A/C/H
  I     A/C/F/I
Closure Table Model
                                  A

                         B                C

              D          E            F       G   H


ID   parent   Ancestor       Descendant
1      A          1              2
2      B          1              4
3      C          1              5
4      D          2              4
5      E          2              5
6      F          1              3
7      G          1              6
8      H          1              7
                  1              8
David Chandler Model
                                               A

                                B                      C

                     D          E                  F        G      H


ID   T   L1 L2 L3        Creating the table:
                         CREATE TABLE nodes
1    A   1   0   0          (id INTEGER NOT NULL PRIMARY KEY
2    B   1   1   0           title VARCHAR(255) NOT NULL
                             L1 INTEGER NOT NULL,
3    C   1   2   0           L2 INTEGER NOT NULL,
                             L3 INTEGER NOT NULL);
4    D   1   1   1
5    E   1   1   2              Algorithm is patened by David Chandler!
6    F   1   2   1
7    G   1   2   2              Hierarchy level is fixed!
8    H   1   2   3
Modified David Chandler Model
                                               A

                                B                      C

                     D          E                  F        G          H


ID   T   L1 L2 L3        Creating the table:
                         CREATE TABLE nodes
1    A   1   0   0          (id INTEGER NOT NULL PRIMARY KEY
2    B   1   2   0           title VARCHAR(255) NOT NULL
                             L1 INTEGER NOT NULL,
3    C   1   3   0           L2 INTEGER NOT NULL,
                             L3 INTEGER NOT NULL);
4    D   1   2   4
5    E   1   2   5              Not sure about implecations of David
6    F   1   3   6              Chandlers patent…
7    G   1   3   7              Hierarchy level is fixed!
8    H   1   3   8
Nested Set Model
                                        1 A 18

                            2 B 7                8 C 17

                    3 D 4   5 E 6            9 F 12    13 G 14 15 H 16

                                             10 I 11
title   lft   rgt      Creating the table:
                        CREATE TABLE nodes
 A      1     18           (title VARCHAR(255) NOT NULL PRIMARY KEY,
 B      2     7            lft INTEGER NOT NULL,
                           rgt INTEGER NOT NULL);
 C      8     17       Finding the root node:
 D      3     4         SELECT *
                           FROM nodes
 E      5     6            WHERE lft = 1;
 F      9     12
                       Finding the leaf nodes:
 G      13    14
                        SELECT *
 H      15    16           FROM nodes
                           WHERE lft = (MAX(rgt) – 1)
  I     10    11
Nested Set Model
                                        1 A 18

                            2 B 7                 8 C 17

                    3 D 4   5 E 6           9 F 12     13 G 14 15 H 16

                                             10 I 11
title   lft   rgt      Finding subtrees:
 A      1     18        SELECT * FROM nodes
                           WHERE lft BETWEEN lft AND rgt
 B      2     7            ORDER BY lft ASC;
 C      8     17        Finding path to a node:
 D      3     4         SELECT * FROM nodes
                            WHERE lft < ? AND rgt > ?
 E      5     6             ORDER BY lft ASC;
 F      9     12
 G      13    14
 H      15    16
  I     10    11
Hybrid Models

                 Combining models


Adjacency List

                                David Chandler
Path Enumeration

                                Nested Set
Closure Table
Nested Set Model

 Problem: Tree must be reorganized on every insertion (table lock).




                           1        A        100

               2      B        49       50        C        99

          D           E                  F                 G           H
      3       24 25       48        51       72       73       14 15       16



Possible solution: Avoid overhead with larger spreads and bigger gaps
Nested Set Model

What datatype shout I use for left and right values?



                INTEGER

                FLOAT / REAL / DOUBLE


                NUMERIC / DECIMAL
Nested Set Model
              with rational numbers



               0/5      A         5/5

    1/5   B       2/5       3/5         C   4/5




a                                                 b

           a+(b-a)/3          a+2(b-a)/3
Nested Set Model
                                  with rational numbers


                                   0/5      A         5/5

                        1/5   B       2/5       3/5         C   4/5


                                            16/25           D   17/25

T   ln   ld   rn   rd
A   0    5    5    5
                                  Adding an aditional child node is alway possible.
B   1    5    2    5              No need to reorganize the table!
C   3    5    4    5
D   16 25 17 25
Nested Set Model
                           Binary Fraction

 node      X      Y
1          1     1/2
1.1        1     3/4
1.1.1      1     7/8
1.1.1.1    1    15/16
1.1.2     7/8   13/16
1.1.3     13/16 25/32
1.2       3/4    5/8
1.2.1     3/4   11/16
1.3       5/8   9/16
Literature




Titel: Trees and Hierarchies in SQL
Autor: Joe Celko
Verlag: Morgan Kaufmann
ISBN: 1558609202
Q&A
Trees and Hierarchies in SQL

Más contenido relacionado

La actualidad más candente

Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Scott Wlaschin
 
Hierarchical data models in Relational Databases
Hierarchical data models in Relational DatabasesHierarchical data models in Relational Databases
Hierarchical data models in Relational Databasesnavicorevn
 
Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...
Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...
Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...DataStax
 
MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MYXPLAIN
 
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成shigeki_ohtsu
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and EffectsMartin Odersky
 
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
JJUG CCC 2018 Spring - I-7 (俺が)はじめての NettyJJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
JJUG CCC 2018 Spring - I-7 (俺が)はじめての NettyShinya Mochida
 
Coherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceCoherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceToshiaki Maki
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesLorenzo Alberton
 
91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOpsAndrew Wu
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2Tsunenori Oohara
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
SQLアンチパターン読書会 第10章 サーティワンフレーバー
SQLアンチパターン読書会 第10章 サーティワンフレーバーSQLアンチパターン読書会 第10章 サーティワンフレーバー
SQLアンチパターン読書会 第10章 サーティワンフレーバーtkfuji
 
猫でもわかるかもしれない SQLインジェクション
猫でもわかるかもしれない SQLインジェクション猫でもわかるかもしれない SQLインジェクション
猫でもわかるかもしれない SQLインジェクションkinme modoki
 
How NOT to Write a Microbenchmark
How NOT to Write a MicrobenchmarkHow NOT to Write a Microbenchmark
How NOT to Write a MicrobenchmarkAzul Systems Inc.
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニングyoku0825
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Yasutaka Kawamoto
 

La actualidad más candente (20)

Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014Domain Driven Design with the F# type System -- F#unctional Londoners 2014
Domain Driven Design with the F# type System -- F#unctional Londoners 2014
 
How to Use JSON in MySQL Wrong
How to Use JSON in MySQL WrongHow to Use JSON in MySQL Wrong
How to Use JSON in MySQL Wrong
 
Hierarchical data models in Relational Databases
Hierarchical data models in Relational DatabasesHierarchical data models in Relational Databases
Hierarchical data models in Relational Databases
 
Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...
Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...
Cassandra Backups and Restorations Using Ansible (Joshua Wickman, Knewton) | ...
 
MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6MySQL Indexing - Best practices for MySQL 5.6
MySQL Indexing - Best practices for MySQL 5.6
 
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and Effects
 
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
JJUG CCC 2018 Spring - I-7 (俺が)はじめての NettyJJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
JJUG CCC 2018 Spring - I-7 (俺が)はじめての Netty
 
Coherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherenceCoherenceを利用するときに気をつけること #OracleCoherence
Coherenceを利用するときに気をつけること #OracleCoherence
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle TreesModern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
Modern Algorithms and Data Structures - 1. Bloom Filters, Merkle Trees
 
91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps91APP: 從 "零" 開始的 DevOps
91APP: 從 "零" 開始的 DevOps
 
Elixirと他言語の比較的紹介 ver.2
Elixirと他言語の比較的紹介ver.2Elixirと他言語の比較的紹介ver.2
Elixirと他言語の比較的紹介 ver.2
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
SQLアンチパターン読書会 第10章 サーティワンフレーバー
SQLアンチパターン読書会 第10章 サーティワンフレーバーSQLアンチパターン読書会 第10章 サーティワンフレーバー
SQLアンチパターン読書会 第10章 サーティワンフレーバー
 
C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0C# 9.0 / .NET 5.0
C# 9.0 / .NET 5.0
 
猫でもわかるかもしれない SQLインジェクション
猫でもわかるかもしれない SQLインジェクション猫でもわかるかもしれない SQLインジェクション
猫でもわかるかもしれない SQLインジェクション
 
How NOT to Write a Microbenchmark
How NOT to Write a MicrobenchmarkHow NOT to Write a Microbenchmark
How NOT to Write a Microbenchmark
 
雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング雑なMySQLパフォーマンスチューニング
雑なMySQLパフォーマンスチューニング
 
Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方Go言語によるwebアプリの作り方
Go言語によるwebアプリの作り方
 

Último

SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 

Último (20)

SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 

Trees and Hierarchies in SQL

  • 1. Trees and Hierarchies in SQL by Eduard Hildebrandt
  • 2. In most projects we have to deal with some kind of trees or hierarchies! Think about… • Categories • Organisation • Threads • Folders • Components •…
  • 3. How can we store an retrieve trees and hierarchies effenciently from relational databases?
  • 4. Agenda • Adjacency List Model • Closure Table Model • Path Enumeration Model • David Chandler Model • Modified David Chandler Model • Nested Set Model • Hyprid Model • Frequent Insertion in Nested Sets
  • 5. What is a „tree“? A tree is a connected, undirected, acyclic grap. A B C D E F G H I
  • 6. What is a „tree“? A tree is a connected, undirected, acyclic grap. A B C D E F G H I X
  • 7. What is a „tree“? A tree is a connected, undirected, acyclic grap. A B C D E F G H I
  • 8. What is a „tree“? A tree is a connected, undirected, acyclic grap. A B C D E F G H I
  • 9. Adjacency List Model A B C D E F G H I title parent Creating the table: CREATE TABLE nodes A null (title VARCHAR(255) NOT NULL PRIMARY KEY, B A parent VARCHAR(255)); C A Finding the root node: D B SELECT * FROM nodes E B WHERE parent IS NULL; F C Finding the leaf nodes: G C SELECT node1.* H C FROM nodes AS node1 LEFT JOIN node AS node2 ON node1.title = node2.parent I F WHERE node2.title = ‘A’;
  • 10. Adjacency List Model UPDATE anomalies A B C D E F G H title parent I A null UPDATE nodes SET title = ‘X’ B A WHERE title = ‘C’; C A D B START TRANSACTION; UPDATE nodes E B SET title = ‘X’ WHERE title = ‘C’; F C UPDATE nodes G C SET parent = ‘X’ WHERE parent = ‘C’; H C COMMIT; I F
  • 11. Adjacency List Model INSERT anomalies INSERT INTO nodes (title, parent) VALUES (‘X’, ‘Y’), X Y (‘Y’, ‘X’); INSERT INTO nodes (title, parent) VALUES X (‘X’, ‘X’); Parent must exist: ALTER TABLE nodes ADD CONSTRAINT parent_fk FOREIGN KEY (parent) REFERENCES nodes (id); Node can not be it‘s own parent: CHECK (title <> parent) Prevent double connections: UNIQUE (title, parent) Connected graph (edges = nodes – 1): CHECK ((SELECT COUNT(*) FROM nodes) – 1 = SELECT COUNT(parent) FROM nodes; One root only: CHECK ((SELECT COUNT(*) FROM nodes WHERE parent IS NULL) = 1);
  • 12. Adjacency List Model DELETE anomalies DELETE FROM nodes WHERE title = ‘C’; A B C D E F G H I
  • 13. Adjacency List Model DELETE anomalies What happens with nodes F, G, H and I? A B ? D E F G H I ALTER TABLE nodes ADD CONSTRAINT parent_fk FOREIGN KEY (parent) REFERENCES nodes (id) ON DELETE ...;
  • 14. Adjacency List Model DELETE anomalies Solution 1: delete all children A B C D E F G H I
  • 15. Adjacency List Model DELETE anomalies Solution 2: move children to the level of the parent A B F G H D E I
  • 16. Adjacency List Model DELETE anomalies Solution 3: replace parent with the first child A B F D E I G H
  • 17. Adjacency List Model with self -references A B C D E F G H title parent I A A Creating the table: CREATE TABLE nodes B A (title VARCHAR(255) NOT NULL PRIMARY KEY, parent VARCHAR(255) NOT NULL); C A D B E B Avoids NULL in the parent column! F C G C H C I F
  • 18. Path Enumeration Model A B C D E F G H I title path Creating the table: CREATE TABLE nodes A A (title VARCHAR(255) NOT NULL PRIMARY KEY B A/B -- don’t use a separater in primary key CHECK (REPLACE (title, ‘/’, ‘’) = title, C A/C path VARCHAR(1024) NOT NULL); D A/B/D E A/B/E F A/C/F G A/C/G H A/C/H I A/C/F/I
  • 19. Closure Table Model A B C D E F G H ID parent Ancestor Descendant 1 A 1 2 2 B 1 4 3 C 1 5 4 D 2 4 5 E 2 5 6 F 1 3 7 G 1 6 8 H 1 7 1 8
  • 20. David Chandler Model A B C D E F G H ID T L1 L2 L3 Creating the table: CREATE TABLE nodes 1 A 1 0 0 (id INTEGER NOT NULL PRIMARY KEY 2 B 1 1 0 title VARCHAR(255) NOT NULL L1 INTEGER NOT NULL, 3 C 1 2 0 L2 INTEGER NOT NULL, L3 INTEGER NOT NULL); 4 D 1 1 1 5 E 1 1 2 Algorithm is patened by David Chandler! 6 F 1 2 1 7 G 1 2 2 Hierarchy level is fixed! 8 H 1 2 3
  • 21. Modified David Chandler Model A B C D E F G H ID T L1 L2 L3 Creating the table: CREATE TABLE nodes 1 A 1 0 0 (id INTEGER NOT NULL PRIMARY KEY 2 B 1 2 0 title VARCHAR(255) NOT NULL L1 INTEGER NOT NULL, 3 C 1 3 0 L2 INTEGER NOT NULL, L3 INTEGER NOT NULL); 4 D 1 2 4 5 E 1 2 5 Not sure about implecations of David 6 F 1 3 6 Chandlers patent… 7 G 1 3 7 Hierarchy level is fixed! 8 H 1 3 8
  • 22. Nested Set Model 1 A 18 2 B 7 8 C 17 3 D 4 5 E 6 9 F 12 13 G 14 15 H 16 10 I 11 title lft rgt Creating the table: CREATE TABLE nodes A 1 18 (title VARCHAR(255) NOT NULL PRIMARY KEY, B 2 7 lft INTEGER NOT NULL, rgt INTEGER NOT NULL); C 8 17 Finding the root node: D 3 4 SELECT * FROM nodes E 5 6 WHERE lft = 1; F 9 12 Finding the leaf nodes: G 13 14 SELECT * H 15 16 FROM nodes WHERE lft = (MAX(rgt) – 1) I 10 11
  • 23. Nested Set Model 1 A 18 2 B 7 8 C 17 3 D 4 5 E 6 9 F 12 13 G 14 15 H 16 10 I 11 title lft rgt Finding subtrees: A 1 18 SELECT * FROM nodes WHERE lft BETWEEN lft AND rgt B 2 7 ORDER BY lft ASC; C 8 17 Finding path to a node: D 3 4 SELECT * FROM nodes WHERE lft < ? AND rgt > ? E 5 6 ORDER BY lft ASC; F 9 12 G 13 14 H 15 16 I 10 11
  • 24. Hybrid Models Combining models Adjacency List David Chandler Path Enumeration Nested Set Closure Table
  • 25. Nested Set Model Problem: Tree must be reorganized on every insertion (table lock). 1 A 100 2 B 49 50 C 99 D E F G H 3 24 25 48 51 72 73 14 15 16 Possible solution: Avoid overhead with larger spreads and bigger gaps
  • 26. Nested Set Model What datatype shout I use for left and right values? INTEGER FLOAT / REAL / DOUBLE NUMERIC / DECIMAL
  • 27. Nested Set Model with rational numbers 0/5 A 5/5 1/5 B 2/5 3/5 C 4/5 a b a+(b-a)/3 a+2(b-a)/3
  • 28. Nested Set Model with rational numbers 0/5 A 5/5 1/5 B 2/5 3/5 C 4/5 16/25 D 17/25 T ln ld rn rd A 0 5 5 5 Adding an aditional child node is alway possible. B 1 5 2 5 No need to reorganize the table! C 3 5 4 5 D 16 25 17 25
  • 29. Nested Set Model Binary Fraction node X Y 1 1 1/2 1.1 1 3/4 1.1.1 1 7/8 1.1.1.1 1 15/16 1.1.2 7/8 13/16 1.1.3 13/16 25/32 1.2 3/4 5/8 1.2.1 3/4 11/16 1.3 5/8 9/16
  • 30. Literature Titel: Trees and Hierarchies in SQL Autor: Joe Celko Verlag: Morgan Kaufmann ISBN: 1558609202
  • 31. Q&A