Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
ЧТО мы храним
Хотя хватит и банального VARCHAR на пару-тройку тысяч байт.
Хотя хватит и банального VARCHAR на пару-тройку тысяч байт.
Более того, база не позволяет сделать поле `Path` длиннее 1000 символов
в жизни вам часто надо извлекать просто рандомный узел?Если бы я извлекал не рендомный узел, а какой-то определенный, то меня могли бы обвинить в фальсификации и в том, что я специально выбрал такие числа, на которых более выгоден мой метод. В моих же тестах явно видно — в среднем FH намного быстрее, чем MP
вы меряете производительность только операции select. Как насчет insert/update?Хорошо. Чуть позже — гляну
Синтетические тесты мало что доказывают, вы бы на сценариях real world потестировали.Консольный форум, как уже говорилось, использует именно эту систему. У меня там не подключено кеширование и акселераторы, я хостюсь на дешёвом хостинге за 5 баксов. Генерация страницы занимает чуть меньше, чем 0.02 секунды. При этом форум с лёгкостью выдержал ХабраЭффект и некоторое замедление в работе было вызвано не движком, а недостаточно широким каналом. Движок же отработал с лёгкостью.
Более того, база не позволяет сделать поле `Path` длиннее 1000 символов (#1071 — Specified key was too long; max key length is 1000 bytes),
DELETE FROM `Elements`
INNER JOIN `ElementsHierarchy` as `Hier`
ON `Hier`.`ElemID` = `Elements`.`ID`
WHERE `Hier`.`ParentID` = {ID} OR `Elements`.`ID` = {ID}
* This source code was highlighted with Source Code Highlighter.Вставка в статье описана — два-три запроса. Перемещение тоже могу описать. То получится где-то два-три запроса на всю ветку. Но работа будет происходить только над элементами ветки и не придется менять часть структуры, которая не затрагивается, как происходит в NestedSets.база не позволяет сделать поле `Path` длиннее 1000 символов (#1071 — Specified key was too long; max key length is 1000 bytes), что значит, что, если у нас средняя длина ID будет 4 символов мы не сможем делать деревья глубже 1000/(4+1), то есть самое глубокое возможное дерево в таком случае — 200 элементов. и 166 при средней длине ключа 5 цифр (если на сайте более 50000 комментариев в среднем)
ElemId, Path
"000" -- первый уровень
"000000" -- второй уровень
"000001000"
"000001001"
"000002"
"001"
"002"
"000" -- первый уровень
"00000" -- второй уровень (2 символа в сегменте)
"0000100"
"0000101"
"00002"
"001"
"002"
Я понимаю что parentlevel не нужен, но если его добавить, то пример ни чем отличается от вашего.
чтобы показать все элементы 2 уровня надо буде написать:
тяжелый inner join
Хотя программно используется лишь один запрос на вставку, база вставляет несколько записей
Если в колонке таблицы многократно дублируются одни и те же значения, то индексы теряют эффективность.
Не ясно, чем задается прядок узлов в дереве.
Про дополнительную таблицу, простите, не понял…
Full Hierarchy — иерархические структуры в базах данных