SlideShare uma empresa Scribd logo
1 de 23
Иерархические структуры  в реляционных базах данных ,[object Object]
Materialized Path;
Nested Sets;
Так что же использовать?;1
Materialized Path (Материализованный путь) ,[object Object]
 Видынаследования;
Использование;
Управление;2
Метод хранения Materialized Path  Схема: 3 path1 path1.path3 path1.path2 path1.path4 path1.path3.path7 path1.path2.path6 path1.path2.path5 path1.path4.path9 path1.path4.path8 Правила: ,[object Object]
Все части пути от начала до разделителей должны присутствовать в базе;
Элемент пути не может содержать разделитель (точку);Свойства: ,[object Object]
Узлы напрямую не связаны;
Родительский путь частично входит в дочерние;,[object Object]
ответ на комментарий
…
…
 комментарий 1.2
 ответ на комментарий
…
…Сообщение 2 ,[object Object]
 ответ на комментарий
 …
 …

Mais conteúdo relacionado

Destaque

Юзабилити интранет порталов
Юзабилити  интранет порталовЮзабилити  интранет порталов
Юзабилити интранет порталовMedia Gorod
 
Sql Server Data Services
Sql Server Data ServicesSql Server Data Services
Sql Server Data ServicesMedia Gorod
 
тарифный план битрикс дмитрий росляков
тарифный план битрикс   дмитрий росляковтарифный план битрикс   дмитрий росляков
тарифный план битрикс дмитрий росляковMedia Gorod
 
Semantic Web & электронные сми илья клинцов
Semantic Web & электронные сми   илья клинцовSemantic Web & электронные сми   илья клинцов
Semantic Web & электронные сми илья клинцовMedia Gorod
 
Инфраструктура крупного географически распределенного интернет проекта: техн...
Инфраструктура крупного географически распределенного интернет проекта:  техн...Инфраструктура крупного географически распределенного интернет проекта:  техн...
Инфраструктура крупного географически распределенного интернет проекта: техн...Media Gorod
 
Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...
Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...
Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...Media Gorod
 
Вебинар Томулевича adjacency
Вебинар Томулевича adjacencyВебинар Томулевича adjacency
Вебинар Томулевича adjacencyMedia Gorod
 
От e-commerce к de-commerce
От e-commerce к de-commerceОт e-commerce к de-commerce
От e-commerce к de-commerceMedia Gorod
 
Постановка задачи на разработку web-систем: что должен знать исполнитель на с...
Постановка задачи на разработку web-систем: что должен знать исполнитель на с...Постановка задачи на разработку web-систем: что должен знать исполнитель на с...
Постановка задачи на разработку web-систем: что должен знать исполнитель на с...Media Gorod
 

Destaque (9)

Юзабилити интранет порталов
Юзабилити  интранет порталовЮзабилити  интранет порталов
Юзабилити интранет порталов
 
Sql Server Data Services
Sql Server Data ServicesSql Server Data Services
Sql Server Data Services
 
тарифный план битрикс дмитрий росляков
тарифный план битрикс   дмитрий росляковтарифный план битрикс   дмитрий росляков
тарифный план битрикс дмитрий росляков
 
Semantic Web & электронные сми илья клинцов
Semantic Web & электронные сми   илья клинцовSemantic Web & электронные сми   илья клинцов
Semantic Web & электронные сми илья клинцов
 
Инфраструктура крупного географически распределенного интернет проекта: техн...
Инфраструктура крупного географически распределенного интернет проекта:  техн...Инфраструктура крупного географически распределенного интернет проекта:  техн...
Инфраструктура крупного географически распределенного интернет проекта: техн...
 
Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...
Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...
Кирилл Мавродиев, Intel – Обзор современных возможностей по распараллеливанию...
 
Вебинар Томулевича adjacency
Вебинар Томулевича adjacencyВебинар Томулевича adjacency
Вебинар Томулевича adjacency
 
От e-commerce к de-commerce
От e-commerce к de-commerceОт e-commerce к de-commerce
От e-commerce к de-commerce
 
Постановка задачи на разработку web-систем: что должен знать исполнитель на с...
Постановка задачи на разработку web-систем: что должен знать исполнитель на с...Постановка задачи на разработку web-систем: что должен знать исполнитель на с...
Постановка задачи на разработку web-систем: что должен знать исполнитель на с...
 

Mais de Media Gorod

Iidf market watch_2013
Iidf market watch_2013Iidf market watch_2013
Iidf market watch_2013Media Gorod
 
E travel 2013 ufs-f
E travel 2013 ufs-fE travel 2013 ufs-f
E travel 2013 ufs-fMedia Gorod
 
Travel shop 2013
Travel shop 2013Travel shop 2013
Travel shop 2013Media Gorod
 
Kozyakov pay u_e-travel2013
Kozyakov pay u_e-travel2013Kozyakov pay u_e-travel2013
Kozyakov pay u_e-travel2013Media Gorod
 
13909772985295c7a772abc7.11863824
13909772985295c7a772abc7.1186382413909772985295c7a772abc7.11863824
13909772985295c7a772abc7.11863824Media Gorod
 
As e-travel 2013
As   e-travel 2013As   e-travel 2013
As e-travel 2013Media Gorod
 
Ishounkina internet research-projects
Ishounkina internet research-projectsIshounkina internet research-projects
Ishounkina internet research-projectsMedia Gorod
 
Orlova pay u group_290813_
Orlova pay u group_290813_Orlova pay u group_290813_
Orlova pay u group_290813_Media Gorod
 
Ep presentation (infographic 2013)
Ep presentation (infographic 2013)Ep presentation (infographic 2013)
Ep presentation (infographic 2013)Media Gorod
 
Iway slides e-travel_2013-11_ready
Iway slides e-travel_2013-11_readyIway slides e-travel_2013-11_ready
Iway slides e-travel_2013-11_readyMedia Gorod
 
Data insight e-travel2013
Data insight e-travel2013Data insight e-travel2013
Data insight e-travel2013Media Gorod
 
Электронное Правительство как Продукт
Электронное Правительство как ПродуктЭлектронное Правительство как Продукт
Электронное Правительство как ПродуктMedia Gorod
 
Lean мышление / Специфика Lean Startup
Lean мышление / Специфика Lean StartupLean мышление / Специфика Lean Startup
Lean мышление / Специфика Lean StartupMedia Gorod
 
Глобальный взгляд на мобильный мир (Nielsen)
 Глобальный взгляд на мобильный мир (Nielsen) Глобальный взгляд на мобильный мир (Nielsen)
Глобальный взгляд на мобильный мир (Nielsen)Media Gorod
 
Как россияне используют смартфоны (Nielsen)
 Как россияне используют смартфоны (Nielsen) Как россияне используют смартфоны (Nielsen)
Как россияне используют смартфоны (Nielsen)Media Gorod
 
Мобильный интернет в России (MailRuGroup)
Мобильный интернет в России (MailRuGroup) Мобильный интернет в России (MailRuGroup)
Мобильный интернет в России (MailRuGroup) Media Gorod
 

Mais de Media Gorod (20)

Itogi2013
Itogi2013Itogi2013
Itogi2013
 
Moneytree rus 1
Moneytree rus 1Moneytree rus 1
Moneytree rus 1
 
Iidf market watch_2013
Iidf market watch_2013Iidf market watch_2013
Iidf market watch_2013
 
E travel 2013 ufs-f
E travel 2013 ufs-fE travel 2013 ufs-f
E travel 2013 ufs-f
 
Travel shop 2013
Travel shop 2013Travel shop 2013
Travel shop 2013
 
Kozyakov pay u_e-travel2013
Kozyakov pay u_e-travel2013Kozyakov pay u_e-travel2013
Kozyakov pay u_e-travel2013
 
13909772985295c7a772abc7.11863824
13909772985295c7a772abc7.1186382413909772985295c7a772abc7.11863824
13909772985295c7a772abc7.11863824
 
As e-travel 2013
As   e-travel 2013As   e-travel 2013
As e-travel 2013
 
Ishounkina internet research-projects
Ishounkina internet research-projectsIshounkina internet research-projects
Ishounkina internet research-projects
 
E travel13
E travel13E travel13
E travel13
 
Orlova pay u group_290813_
Orlova pay u group_290813_Orlova pay u group_290813_
Orlova pay u group_290813_
 
Ep presentation (infographic 2013)
Ep presentation (infographic 2013)Ep presentation (infographic 2013)
Ep presentation (infographic 2013)
 
Iway slides e-travel_2013-11_ready
Iway slides e-travel_2013-11_readyIway slides e-travel_2013-11_ready
Iway slides e-travel_2013-11_ready
 
Data insight e-travel2013
Data insight e-travel2013Data insight e-travel2013
Data insight e-travel2013
 
Электронное Правительство как Продукт
Электронное Правительство как ПродуктЭлектронное Правительство как Продукт
Электронное Правительство как Продукт
 
Lean мышление / Специфика Lean Startup
Lean мышление / Специфика Lean StartupLean мышление / Специфика Lean Startup
Lean мышление / Специфика Lean Startup
 
Глобальный взгляд на мобильный мир (Nielsen)
 Глобальный взгляд на мобильный мир (Nielsen) Глобальный взгляд на мобильный мир (Nielsen)
Глобальный взгляд на мобильный мир (Nielsen)
 
Как россияне используют смартфоны (Nielsen)
 Как россияне используют смартфоны (Nielsen) Как россияне используют смартфоны (Nielsen)
Как россияне используют смартфоны (Nielsen)
 
Мобильный интернет в России (MailRuGroup)
Мобильный интернет в России (MailRuGroup) Мобильный интернет в России (MailRuGroup)
Мобильный интернет в России (MailRuGroup)
 
Meta Mass Media
Meta Mass MediaMeta Mass Media
Meta Mass Media
 

Вебинар Томулевича materialized.path 2

  • 1.
  • 4. Так что же использовать?;1
  • 5.
  • 9.
  • 10. Все части пути от начала до разделителей должны присутствовать в базе;
  • 11.
  • 13.
  • 15.
  • 16.
  • 18. ответ на комментарий
  • 19.
  • 20.
  • 21. ответ на комментарий
  • 25. ответ на комментарий
  • 27.
  • 30. 15”
  • 31. 17”
  • 32.
  • 33. NEC
  • 41.
  • 44.
  • 45. HP
  • 46.
  • 47. …4
  • 48.
  • 50.
  • 51.
  • 53. ответ на комментарий
  • 54.
  • 55.
  • 56. ответ на комментарий
  • 60. ответ на комментарий
  • 62.
  • 65. 15”
  • 66. 17”
  • 67.
  • 68. NEC
  • 76.
  • 79.
  • 80. HP
  • 81.
  • 82. …5
  • 83. Виды наследований Наследование по вхождению: 6 goods goods.monitors goods.monitors.nec.15 goods.monitors.nec.17 goods.monitors.nec.19 goods.monitors.samsung goods.monitors.samsung.15 goods.monitors.samsung.17 goods.monitors.samsung.19 goods.monitors.viewsonic.15 goods.monitors.viewsonic.17 goods.monitors.viewsonic.19 goods.printers goods.printers.hp goods.printers.hp.inc goods.printers.hp.laser goods.printers.samsung goods.printers.samsung.laser
  • 84. Виды наследований 7 Наследование по вхождению: goods goods. monitors goods. monitors. nec goods. monitors. nec. 17 goods. monitors. nec. 19 goods. monitors. samsung goods. monitors. samsung. 15 goods. monitors. samsung. 17 goods. monitors. samsung. 19 goods. monitors. viewsonic goods. monitors. viewsonic. 17 goods. monitors. viewsonic. 19 goods. printers goods. printers. hp goods. printers. hp. inc goods. printers. hp. laser goods. printers. samsung goods. printers. samsung. laser
  • 85. Виды наследований 8 Наследование по вхождению, множественное: goods goods. monitors goods. monitors. nec goods. monitors. nec. 17 goods. monitors. nec. 19 goods. monitors. samsung goods. monitors. samsung. 15 goods. monitors. samsung. 17 goods. monitors. samsung. 19 goods. monitors. viewsonic goods. monitors. viewsonic. 17 goods. monitors. viewsonic. 19 goods. printers goods. printers. hp goods. printers. hp. inc goods. printers. hp. laser goods. printers. samsung goods. printers. samsung. laser … … … … 17 … … 19 … … … … samsung … … … laser … … … … Мониторы 17” … … Мониторы 19” … … … … Товары марки Samsung … … … Лазерные принтеры
  • 86. 9 Наследование по вхождению Привязка концевых ключей: PostgeSQL: SELECTt.*, i.* FROMmp_treeASt JOINitemsASiONi.id = substring(t.pathFROM E'([^]+)$')::integer; MySQL: SELECTt.*, i.* FROMmp_treeASt JOINitemsASiONi.id = SUBSTRING_INDEX(t.path, '.', -1); Привязка по ключам: SELECT t.*, i.* FROMitemsASi JOINmp_treeAStON t.pathLIKEi.id || '.%'OR t.pathLIKE'%.' || i.id OR t.pathLIKE'%.' || i.id || '.%' WHEREi.id = 2;
  • 87. 10 Наследование по вхождению Привязка по ключам: PostgeSQL: CREATE OR REPLACE FUNCTION "public"."mp_path_to_array" ( "path" text ) RETURNSinteger [] AS $body$ DECLARE path_arrayINTEGER[]; item_aliasTEXT; BEGIN FORitem_aliasIN SELECT regexp_split_to_table(path, E'.') LOOP path_array := array_append(path_array, item_alias::integer); END LOOP; RETURNpath_array; END; $body$ LANGUAGE'plpgsql'; SELECTi.* FROMitemsASiWHEREi.id = ANY (mp_path_to_array('1.2.3.4.5'));
  • 88. Структуры таблиц Множественное наследование: FUNCTIONS tree items id INTEGER path TEXT … path TEXT tid INTEGER Множество деревьев: WHERE tree trees id INTEGER … 11
  • 89.
  • 93. Использование Materialized Path Получение смежных узлов: Родительский узел: 13 MySQL: SELECT * FROMmp_tree WHERE path = SUBSTRING([path], 1, CHAR_LENGTH([path]) - CHAR_LENGTH(SUBSTRING_INDEX([path], '.', -1)) - 1); PostgreSQL: SELECT * FROMmp_tree WHERE path = substring([path]FROM E'^(.+[^])[^]+$'); PostgreSQL (ltree): SELECT * FROMmp_tree WHERE path = subpath([path], 0, -1);
  • 94. Использование Materialized Path Получение смежных узлов: Подчиненные узлы: 14 MySQL: SELECT * FROMmp_tree WHERE[path] = SUBSTRING(path, 1, CHAR_LENGTH(path) - CHAR_LENGTH(SUBSTRING_INDEX(path, '.', -1)) - 1); PostgreSQL: SELECT * FROMmp_tree WHERE[path] = substring(path FROM E'^(.+[^])[^]+$'); PostgreSQL (ltree): SELECT* FROMmp_tree WHERE path ~ '[path].*{1}';
  • 95. Получение родительской ветви: Общий: SELECTt.* FROMmp_treeASt WHERE[path]LIKEt.path || '.%‘ ORDER BY t.path; 15 Использование Materialized Path PostgreSQL (ltree): SELECTt.* FROMmp_treeASt WHEREt.path<@ [path]ANDt.path<> [path] ORDERBYt.path;
  • 96. Получение дочерней ветви: Общий: SELECTt.* FROMmp_treeASt WHEREt.pathLIKE'[path].%‘ ORDER BY t.path; 16 Использование Materialized Path PostgreSQL (ltree): SELECTt.* FROMmp_treeASt WHEREt.path~ '[path].*' ORDERBYt.path;
  • 97.
  • 98.
  • 100. Управление Materialized Path Контроль подчиненности: Триггер PostgreSQL: CREATE OR REPLACE FUNCTION "public"."mp_tree_update_trigger" () RETURNStriggerAS $body$ DECLARE tmp_pathTEXT; BEGIN -- Если произошло изменение родителя узла IF NEW.path <> OLD.pathTHEN -- Проверяем, что бы не поставить родителем потомка IFNEW.pathLIKE OLD.path || ‘.%’ THEN RAISE NOTICE 'Нельзя ставить потомком родителя!'; NEW.path := OLD.path; END IF; -- Проверяем, что родитель есть IF NEW.pathLIKE '%.%‘ THEN SELECTt.pathINTOtmp_path FROMmp_treeAS t WHEREt.path= substring(NEW.pathFROM E'^(.+[^])[^]+$'); IFtmp_pathIS NULLTHEN RAISE NOTICE 'Нельзя ставить несуществующего родителя!'; NEW.path := OLD.path; END IF; END IF; END IF; RETURN NEW; END; $body$ LANGUAGE 'plpgsql'; CREATE TRIGGER "mp_tree_update" BEFORE UPDATE ON "public"."mp_tree" FOR EACH ROW EXECUTE PROCEDURE "public"."mp_tree_update_trigger"(); 18
  • 101. Управление Materialized Path Контроль подчиненности: Триггер PostgreSQL: CREATE OR REPLACE FUNCTION "public"."mp_tree_update_trigger" () RETURNStriggerAS $body$ DECLARE tmp_pathTEXT; BEGIN -- Если произошло изменение родителя узла IF NEW.path <> OLD.pathTHEN -- Проверяем, что бы не поставить родителем потомка IFNEW.pathLIKE OLD.path || ‘.%’ THEN RAISE NOTICE 'Нельзя ставить потомком родителя!'; NEW.path := OLD.path; END IF; -- Проверяем, что родитель есть IF NEW.pathLIKE '%.%‘ THEN SELECTt.pathINTOtmp_path FROMmp_treeAS t WHEREt.path= substring(NEW.pathFROM E'^(.+[^])[^]+$'); IFtmp_pathIS NULLTHEN RAISE NOTICE 'Нельзя ставить несуществующего родителя!'; NEW.path := OLD.path; END IF; END IF; END IF; RETURN NEW; END; $body$ LANGUAGE 'plpgsql'; CREATE TRIGGER "mp_tree_update" BEFORE UPDATE ON "public"."mp_tree" FOR EACH ROW EXECUTE PROCEDURE "public"."mp_tree_update_trigger"(); 19
  • 102. Управление Materialized Path Денормализация: Триггер INSERT PostgreSQL(ltree): CREATE OR REPLACE FUNCTION "public"."_mp_tree_insert_before_trigger" ( ) RETURNStrigger AS $body$ DECLARE new_pathltree; BEGIN IFNEW.pathIS NOT NULL THEN --- передан, какой-то материализованный путь ------- обрезаем в материализованном пути id вставляемого узла, если он есть new_path:= CASE WHEN NEW.id::text = subpath(NEW.path, -1, 1)::text THENsubpath(NEW.path, 0, -1) ELSENEW.path END; ------- проверяем существование родителя SELECTmp.pathINTOnew_path FROMmp_treeASmp WHEREmp.path= new_pathOR mp.id::text = new_path::text; ------- родителя не нашли IFnew_pathIS NULL OR new_path= '' THEN NEW.path:= NEW.id::text; ELSE -- родителя нашли NEW.path:= new_path|| NEW.id::text; END IF; ELSE NEW.path:= NEW.id::text; END IF; RETURNNEW; END; $body$ LANGUAGE'plpgsql'; CREATE TRIGGER “mp_tree_insert_before" BEFORE INSERT ON "public"."mp_tree" FOR EACH ROW EXECUTE PROCEDURE "public"."_mp_tree_insert_before_trigger"(); 20
  • 103. Управление Materialized Path Денормализация: Триггер UPDATE PostgreSQL(ltree): CREATE OR REPLACE FUNCTION "public"."_mp_tree_update_after_trigger" ()RETURNStriggerAS $body$ DECLARE tid INTEGER; BEGIN --- Принудительно запрещаем изменять ID NEW.id := OLD.id; --- Приводим NULL значение материализованного пути к ID NEW.path:= CASE WHEN NEW.pathIS NULL THEN NEW.id::text ELSENEW.path::text END; --- Есть ли у нас изменения материализованного пути IFNEW.path<> OLD.pathTHEN ------- Проверяем что новое значение материализованного пути ------- лежит не пределах подчинения и что на его конце ID IFNEW.path~ ('*.' || NEW.id::text || '.*{1,}')::lqueryOR NEW.path~ ('*.!' || NEW.id::text)::lquery THEN RAISE EXCEPTION 'Bad path!'; END IF; ------- Если уровень больше 1 то стоит проверить родителя IF nlevel(NEW.path) > 1 THEN SELECT m.id INTO tidFROMmp_tree AS m WHEREm.path= subpath(NEW.path, 0, nlevel(NEW.path) - 1); IFtidIS NULL THEN RAISE EXCEPTION 'Bad parent!'; END IF; END IF; ------- Обновляем детей узла следующего уровня UPDATEmp_tree SETpath = NEW.path|| id::text WHEREpath ~ (OLD.path::text || '.*{1}')::lquery; END IF; RETURN NEW; END; $body$ LANGUAGE 'plpgsql';   CREATE TRIGGER “mp_tree_update_after" AFTER UPDATE ON "public"."mp_tree" FOR EACH ROW EXECUTE PROCEDURE "public"."_mp_tree_update_after_trigger"(); 21
  • 104. Управление Materialized Path Денормализация: Триггер DELETE PostgreSQL(ltree): CREATE OR REPLACE FUNCTION "public"."_mp_tree_delete_after_trigger" () RETURNStrigger AS $body$ BEGIN DELETEFROMmp_tree WHEREpath ~ (OLD.path::text || '.*{1}')::lquery; RETURN OLD; END; $body$ LANGUAGE'plpgsql';  CREATE TRIGGER "mp_tree_delete_after" AFTER DELETE ON "public"."mp_tree" FOR EACH ROW EXECUTE PROCEDURE "public"."_mp_tree_delete_after_trigger"();  22
  • 105. Вопросы? Статьи по теме: http://doc.prototypes.ru/database/trees/ Сергей Томулевич Rambler, Москва, 2010 Карикатуры: Сергей Корсун 23