ݺߣ

ݺߣShare a Scribd company logo
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 (8)

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

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