Solmyr: мне нужны для конкретных элементов все родители. То есть читать дерево надо в обратную сторону, не от корня к ветвям, а от какого-то места к корню. Причем неплохо если эту операцию можно выполнять пакетно, т.е. найти всех родителей для вот этих 50 штук элементов.
Тоже два запроса:
1. select left_key, right_key from table where id='$target'
2. select .... where left_key <= $left_key and right_key >= $right_key order by left_key asc // получить всех родителей для элемента
Можно поробовать объединить эти два запроса в один, тогда будет "пакетный" режим.
н-да, хорошую идею всегда можно угробить - статья и реализация жесть...
В статье предлагают такую структуру данных:
CREATE my_tree (
id INT(10) NOT NULL AUTO_INCREMENT,
name VARCHAR(150) NOT NULL,
left_key INT(10) NOT NULL DEFAULT 0,
right_key INT(10) NOT NULL DEFAULT 0,
level INT(10) NOT NULL DEFAULT 0,
PRIMARY KEY id,
INDEX left_key (left_key, right_key, level)
)
1. parent - не хранится, при малейшем сбое/глюке - дерево посыпится. Операции вставки/удаления/перемещения - "высший" и бесполезный пилотаж. Вся мольба на поля left_key и right_key... Бред.
2. level - бесполезное поле, т.к. выборка может идти не от корня. Удобнее формировать его на лету, это не ресурсоемкая операция.
Более удобная и надежная такая структура данных:
CREATE my_tree (
id INT(10) NOT NULL AUTO_INCREMENT,
name VARCHAR(150) NOT NULL,
left_key INT(10) NOT NULL DEFAULT 0,
right_key INT(10) NOT NULL DEFAULT 0,
parent INT(10) NOT NULL DEFAULT 0,
PRIMARY KEY id,
INDEX left_key (left_key)
)
В этой структуре значимые поля: id и parent.
left_key и right_key - просто "технические" поля, они заполняются при ребилде дерева. Удобно перед ребилдом их вообще обнулять, чтобы автоматом находить и исправлять возможные "потерянные" ветки.
Все операции по модификации дерева сводятся к изменению одного поля - parent.
Добавление/перемещение/массовая вставка - баналоно просто, ставим нужный parent и все.
Удаление всей ветки - легко, удаляем строки - это все.
После модификации дерева - запускаем ребилд, который заполняет поля left_key и right_key. Эти поля нужны для очень быстрого чтения любого куска дерева.
Сам процесс получения всего дерева или любого куска дерева сводится к двум sql запросам, упрощенно:
1. select left_key, right_key from table where id='$id' // получаем left_key и right_key нужного(корневого) элемента.
(выборка быстрая, т.к. идет по примари или уникальному ключу)
2. select .... where left_key between $left_key and $right_key order by left_key asc // получаем само дерево или нужную ветвь
(выборка быстрая, т.к. идет по индексу left_key)
Все, дерево у нас уже есть. На пхп один раз(один цикл) пробегаемся по нему - заполняем level и children.
Konceptovskiy: Везде одно и тоже, текст, картинка, видео, кнопки плюсовать-репостить, рейтинги юзеров, бонусные системы(за коммент, публикации), репа плюс-минус, форумы, чаты, пользовательские блоги. Нового ничего за последние 10 лет, а движков нет.
Топик начинался интереснее, но хотелки свелись к обычному варезнику...
DenisVS: Мне очень не хватает возможности редактирования вложенных файлов не в веб-интерфейсе, а в специальной программе. К примеру, конфигов и скриптов в продвинутом редакторе или IDE, графики в графическом редакторе, ну и т.д.
Если в веб интерфейсе редактирование идет через textarea, то может помочь плагин к файрфоксу It's All Text! - он вызывает внешний редактор для редактирования содержимого textarea. При сохранении, во внешнем редакторе (Ctrl+S), отредактированое содержимое возвращается назад в поле textarea.
В исходном посте: 100 городов... по 10 последних новостей для каждого города. 100*10=1000 новостей на одной странице. Интересно их кто-нибудь будет читать? :)
Следующий пост: where `id`=1000 order by `ido` DESC limit 5
Итого 5000 новостей на одной странице... километровые портянки в дорвеях нервно курят в сторонке. 😂
Шутки, шутками, но тут чудеса в одном запросе вряд-ли будут. Можно получить одним запросом самую последнюю новость с любого количества городов.
Получить 10 последних новостей одним запросом будет проблематично. Пытаться испольховать финты типа where ... ido>=max(ido)-5 (при условии, что ido последовательно и непрерывно в пределах одного id) - может вылезти боком при удалении новостей, да и придеться делать лишние телодвижения пля поддержки последовательной и непрерывной нумерации, по затратам - оно того не стоит.
Рабочие варианты: кеширование, как у Вас, последних новостей в отдельной таблице или кеширование уже результирующего html блока.
select * where `id`=1 order by `ido` DESC limit 5
union all
select * where `id`=2 order by `ido` DESC limit 5
union all
....
select * where `id`=1000 order by `ido` DESC limit 5
Для подъема больших дампов лучше использовать штатые средства самого mysql, из командной строки.
Дампы я поднимаю так:
Для винды попробуйте распаковывать дамп в STOUT при помощи 7zip, если не ошибаюсь ключик -so
П.С. я пользуюсь дампером, работает очень корректно, рекомендую.
Дампер хороший(лучше многих), сам использую. Но на больших дампах - ой...
Про "очень корректно" - я бы убрал слово "очень". При подъеме некоторых баз с миксом разных кодировок внутри случается эпик фейл.
упс, опоздал с советом, но хорошо, что все получилось. :)
Про требования этого фрихостинга читайте внимательно: каждые 30 дней нужно заходить в их панель управления.
Пропустили... - хостинг прощай. Мелочь, а не приятно.
Элементарно - юзайте TOR.
но не забывайте, что пачка TOR нод может контролироваться/логироваться кем угодно.
admak, а как с удобством переноса веток дерева обстоит дело? Удобно ли?
Перенос ветки - это изменение парента у нее и запуск ребилда. Одновременно переносить можно любое количество ветвей, затем ребилд.
Преемущество этого вида дерева:
- быстрые выборки
- любой уровень вложености
- легко модифицировать дерево (удаление/вставка/перемещение ветвей)
Недостаток:
- необходимость запуска ребилда при модификации дерева.
Поэтому это дерево лучше использовать там, где дерево меняется не часто, например для категорий.
мне нужны для конкретных элементов все родители. То есть читать дерево надо в обратную сторону, не от корня к ветвям, а от какого-то места к корню. Причем неплохо если эту операцию можно выполнять пакетно, т.е. найти всех родителей для вот этих 50 штук элементов.
Тоже два запроса:
1. select left_key, right_key from table where id='$target'
2. select .... where left_key <= $left_key and right_key >= $right_key order by left_key asc // получить всех родителей для элемента
Можно поробовать объединить эти два запроса в один, тогда будет "пакетный" режим.
не скажу, почитать про него нужно
Используйте Nested Sets (вложенные множества) для хранения деревьев сложной структуры.
н-да, хорошую идею всегда можно угробить - статья и реализация жесть...
В статье предлагают такую структуру данных:
1. parent - не хранится, при малейшем сбое/глюке - дерево посыпится. Операции вставки/удаления/перемещения - "высший" и бесполезный пилотаж. Вся мольба на поля left_key и right_key... Бред.
2. level - бесполезное поле, т.к. выборка может идти не от корня. Удобнее формировать его на лету, это не ресурсоемкая операция.
Более удобная и надежная такая структура данных:
В этой структуре значимые поля: id и parent.
left_key и right_key - просто "технические" поля, они заполняются при ребилде дерева. Удобно перед ребилдом их вообще обнулять, чтобы автоматом находить и исправлять возможные "потерянные" ветки.
Все операции по модификации дерева сводятся к изменению одного поля - parent.
Добавление/перемещение/массовая вставка - баналоно просто, ставим нужный parent и все.
Удаление всей ветки - легко, удаляем строки - это все.
После модификации дерева - запускаем ребилд, который заполняет поля left_key и right_key. Эти поля нужны для очень быстрого чтения любого куска дерева.
Сам процесс получения всего дерева или любого куска дерева сводится к двум sql запросам, упрощенно:
1. select left_key, right_key from table where id='$id' // получаем left_key и right_key нужного(корневого) элемента.
(выборка быстрая, т.к. идет по примари или уникальному ключу)
2. select .... where left_key between $left_key and $right_key order by left_key asc // получаем само дерево или нужную ветвь
(выборка быстрая, т.к. идет по индексу left_key)
Все, дерево у нас уже есть. На пхп один раз(один цикл) пробегаемся по нему - заполняем level и children.
Везде одно и тоже, текст, картинка, видео, кнопки плюсовать-репостить, рейтинги юзеров, бонусные системы(за коммент, публикации), репа плюс-минус, форумы, чаты, пользовательские блоги. Нового ничего за последние 10 лет, а движков нет.
Топик начинался интереснее, но хотелки свелись к обычному варезнику...
А варезник - это ДЛЕ. (чаще всего)
Мне очень не хватает возможности редактирования вложенных файлов не в веб-интерфейсе, а в специальной программе. К примеру, конфигов и скриптов в продвинутом редакторе или IDE, графики в графическом редакторе, ну и т.д.
Если в веб интерфейсе редактирование идет через textarea, то может помочь плагин к файрфоксу It's All Text! - он вызывает внешний редактор для редактирования содержимого textarea. При сохранении, во внешнем редакторе (Ctrl+S), отредактированое содержимое возвращается назад в поле textarea.
Спасибо за топик, пойду смотреть dokuwiki.
Я ответил только на:
И как это объединить в один запрос?
:)
Ставьте реальные цели. (с) старая социальная реклама.
В исходном посте: 100 городов... по 10 последних новостей для каждого города. 100*10=1000 новостей на одной странице. Интересно их кто-нибудь будет читать? :)
Следующий пост: where `id`=1000 order by `ido` DESC limit 5
Итого 5000 новостей на одной странице... километровые портянки в дорвеях нервно курят в сторонке. 😂
Шутки, шутками, но тут чудеса в одном запросе вряд-ли будут. Можно получить одним запросом самую последнюю новость с любого количества городов.
Получить 10 последних новостей одним запросом будет проблематично. Пытаться испольховать финты типа where ... ido>=max(ido)-5 (при условии, что ido последовательно и непрерывно в пределах одного id) - может вылезти боком при удалении новостей, да и придеться делать лишние телодвижения пля поддержки последовательной и непрерывной нумерации, по затратам - оно того не стоит.
Рабочие варианты: кеширование, как у Вас, последних новостей в отдельной таблице или кеширование уже результирующего html блока.
И как это объединить в один запрос?