SlideShare a Scribd company logo
1 of 22
Download to read offline
Czy mi się przyda hierarchyid? 
80. spotkanie PLSSUG Warszawa, 09.10.2014.
O czym będzie? 
• O hierarchiach ogólnie 
• Hierarchyid jako takie 
• Męczenie i dręczenie hierarchyid 
• Ograniczenia i możliwości 
• Linki i literatura
O mnie 
Bartosz Ratajczyk 
programista baz danych 
(i aplikacji) 
czasem też administrator 
PHP, JS, C#, T-SQL, SAS 4GL 
http://bartekr.net | b.ratajczyk@gmail.com | MCTS, MCP
Hierarchia 
ustalony porządek wg wybranego 
kryterium, np. ważności
Przykłady hierarchii 
• schemat organizacyjny firmy 
• system plików 
• kategorie sklepu internetowego 
• wątki dyskusji 
• wykaz składników (bill of materials) 
• masa innych 
• (i innych)
Jak to sensownie obsługiwać w bazie? 
• Adjacency List 
• Nested sets 
• Closure table/bridge table 
• Lineage column / materialized path 
• (inne)
Adjacency List 
element rodzic 
A NULL 
B A 
C A 
D B 
E B 
F E 
G C 
H C 
I C
Nested sets 
element lewy prawy 
A 1 18 
B 2 9 
C 10 17 
D 3 4 
E 5 8 
F 6 7 
G 11 12 
H 13 14 
I 15 16
Closure table/bridge table 
ID element 
1 A 
2 B 
3 C 
4 D 
5 E 
6 F 
7 G 
8 H 
9 I 
rodzic dziecko 
1 2 
1 4 
1 5 
1 6 
2 4 
2 5 
2 6 
5 6 
… … 
rodzic dziecko poziom 
1 2 1 
1 4 2 
1 5 2 
1 6 3 
2 4 1 
2 5 1 
2 6 2 
5 6 1 
… … …
Lineage column/materialized path 
element sciezka 
A A 
B A/B 
C A/C 
D A/B/D 
E A/B/E 
F A/B/E/F 
G A/C/G 
H A/C/H 
I A/C/I
Hierarchyid 
• typ danych .NET 
• materialized path w wersji MS 
• wystarczy jedna kolumna do obsługi hierarchii 
• duże upakowanie danych 
• zawsze bez problemów dodasz węzeł potomny 
• domyślnie przeszukuje w dół hierarchii
Hierarchyid
Metody obsługi 
SELECT 
-- statyczne 
hierarchyid::GetRoot(), 
hierarchyid::Parse('/1/2/3/4/5/'), 
-- dynamiczne 
@h.GetLevel(), 
@h.GetAncestor(@n), 
@h.GetDescendant(@m, @n), 
@h.IsDescendantOf(@n), 
@h.GetReparentedValue(@m, @n), 
@h.ToString() 
-- tylko .NET 
-- hierarchyid.Read() 
-- hierarchyid.Write()
Indeksy 
Depth first
Indeksy 
Breadth first
DEMO
Są pewne ograniczenia 
• maksymalny rozmiar węzła to 892 bajty 
• kanoniczna reprezentacja poziomu/węzła nie 
dłuższa niż 14-15 znaków 
• chyba że mamy węzeł „z kropkami”
Ale i zalety 
• zajmuje mało miejsca 
• wystarczy jedna kolumna do obsługi hierarchii 
• wygodny zestaw metod do obsługi
Porównanie sposobów 
obsługi hierarchii 
(nie, jednak nie)
Co zapamiętać 
• zajmuje niewiele miejsca 
• metody tylko generują identyfikator 
• programista robi całą robotę
Do poczytania 
• Microsoft SQL Server 2008 Bible – Paul 
Nielsen et al. 
• Inside Microsoft SQL Server 2008: T-SQL 
Querying – Itzik Ben-Gan et al. 
• Joe Celko’s Trees and Hierarchies in SQL for 
Smarties, Second Edition – Joe Celko
Linki 
• Jak może działać hierarchyid: 
http://www.adammil.net/blog/v100_how_the_SQL_Server_hierarc 
hyid_data_type_works_kind_of_.html 
• Przykłady porównań metod obsługi hierarchii 
– Bill Karwin - http://www.slideshare.net/billkarwin/models-for-hierarchical- 
data str. 69 lub http://www.slideshare.net/billkarwin/sql-antipatterns- 
strike-back str. 77 
– Stackoverflow: http://stackoverflow.com/questions/4048151/what-are- 
the-options-for-storing-hierarchical-data-in-a-relational-database 
• Jedno z porównań prędkości działania obsługi hierarchii w MS SQL 
http://jsimonbi.wordpress.com/2011/03/01/sql-hierarchy-comparative- 
performance-2/ 
• Patent metody Davida Chandlera: 
http://www.google.com/patents/US6480857

More Related Content

More from Bartosz Ratajczyk

More from Bartosz Ratajczyk (8)

Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99Szkolenia i certyfikacjesqlserver2016_plssug99
Szkolenia i certyfikacjesqlserver2016_plssug99
 
Podstawy ETL z SSIS
Podstawy ETL z SSISPodstawy ETL z SSIS
Podstawy ETL z SSIS
 
XML w SQL Server w praktyce
XML w SQL Server w praktyceXML w SQL Server w praktyce
XML w SQL Server w praktyce
 
Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?Jak szybko przetwarzasz hurtowe ilości XML?
Jak szybko przetwarzasz hurtowe ilości XML?
 
Operacje minimalnie logowane
Operacje minimalnie logowaneOperacje minimalnie logowane
Operacje minimalnie logowane
 
Co to te CTE?
Co to te CTE?Co to te CTE?
Co to te CTE?
 
O co chodzi z FILESTREAM?
O co chodzi z FILESTREAM?O co chodzi z FILESTREAM?
O co chodzi z FILESTREAM?
 
Alerty WMI
Alerty WMIAlerty WMI
Alerty WMI
 

Czy mi się przyda hierarchyid?

  • 1. Czy mi się przyda hierarchyid? 80. spotkanie PLSSUG Warszawa, 09.10.2014.
  • 2. O czym będzie? • O hierarchiach ogólnie • Hierarchyid jako takie • Męczenie i dręczenie hierarchyid • Ograniczenia i możliwości • Linki i literatura
  • 3. O mnie Bartosz Ratajczyk programista baz danych (i aplikacji) czasem też administrator PHP, JS, C#, T-SQL, SAS 4GL http://bartekr.net | b.ratajczyk@gmail.com | MCTS, MCP
  • 4. Hierarchia ustalony porządek wg wybranego kryterium, np. ważności
  • 5. Przykłady hierarchii • schemat organizacyjny firmy • system plików • kategorie sklepu internetowego • wątki dyskusji • wykaz składników (bill of materials) • masa innych • (i innych)
  • 6. Jak to sensownie obsługiwać w bazie? • Adjacency List • Nested sets • Closure table/bridge table • Lineage column / materialized path • (inne)
  • 7. Adjacency List element rodzic A NULL B A C A D B E B F E G C H C I C
  • 8. Nested sets element lewy prawy A 1 18 B 2 9 C 10 17 D 3 4 E 5 8 F 6 7 G 11 12 H 13 14 I 15 16
  • 9. Closure table/bridge table ID element 1 A 2 B 3 C 4 D 5 E 6 F 7 G 8 H 9 I rodzic dziecko 1 2 1 4 1 5 1 6 2 4 2 5 2 6 5 6 … … rodzic dziecko poziom 1 2 1 1 4 2 1 5 2 1 6 3 2 4 1 2 5 1 2 6 2 5 6 1 … … …
  • 10. Lineage column/materialized path element sciezka A A B A/B C A/C D A/B/D E A/B/E F A/B/E/F G A/C/G H A/C/H I A/C/I
  • 11. Hierarchyid • typ danych .NET • materialized path w wersji MS • wystarczy jedna kolumna do obsługi hierarchii • duże upakowanie danych • zawsze bez problemów dodasz węzeł potomny • domyślnie przeszukuje w dół hierarchii
  • 13. Metody obsługi SELECT -- statyczne hierarchyid::GetRoot(), hierarchyid::Parse('/1/2/3/4/5/'), -- dynamiczne @h.GetLevel(), @h.GetAncestor(@n), @h.GetDescendant(@m, @n), @h.IsDescendantOf(@n), @h.GetReparentedValue(@m, @n), @h.ToString() -- tylko .NET -- hierarchyid.Read() -- hierarchyid.Write()
  • 16. DEMO
  • 17. Są pewne ograniczenia • maksymalny rozmiar węzła to 892 bajty • kanoniczna reprezentacja poziomu/węzła nie dłuższa niż 14-15 znaków • chyba że mamy węzeł „z kropkami”
  • 18. Ale i zalety • zajmuje mało miejsca • wystarczy jedna kolumna do obsługi hierarchii • wygodny zestaw metod do obsługi
  • 19. Porównanie sposobów obsługi hierarchii (nie, jednak nie)
  • 20. Co zapamiętać • zajmuje niewiele miejsca • metody tylko generują identyfikator • programista robi całą robotę
  • 21. Do poczytania • Microsoft SQL Server 2008 Bible – Paul Nielsen et al. • Inside Microsoft SQL Server 2008: T-SQL Querying – Itzik Ben-Gan et al. • Joe Celko’s Trees and Hierarchies in SQL for Smarties, Second Edition – Joe Celko
  • 22. Linki • Jak może działać hierarchyid: http://www.adammil.net/blog/v100_how_the_SQL_Server_hierarc hyid_data_type_works_kind_of_.html • Przykłady porównań metod obsługi hierarchii – Bill Karwin - http://www.slideshare.net/billkarwin/models-for-hierarchical- data str. 69 lub http://www.slideshare.net/billkarwin/sql-antipatterns- strike-back str. 77 – Stackoverflow: http://stackoverflow.com/questions/4048151/what-are- the-options-for-storing-hierarchical-data-in-a-relational-database • Jedno z porównań prędkości działania obsługi hierarchii w MS SQL http://jsimonbi.wordpress.com/2011/03/01/sql-hierarchy-comparative- performance-2/ • Patent metody Davida Chandlera: http://www.google.com/patents/US6480857