Я достаточно долго наблюдал за темой - потому что эти события меня, как и всех нас, волнуют. И даже несмотря на то, что изначально тема не соответствует правилам конференции - я не стал её закрывать, так как это сродни цензуре, которую я ненавижу всей душой.
Однако - я могу лишь констатировать факт: никто точно не знает, как, что и по какой причине произошло в конкретно взятом месте. Не исключено, что в некоторых случаях правду ото лжи отделить вообще не получится, потому что мотивы обеих сторон могли быть одновременно и "хорошими" и "плохими" (то есть, нельзя их разделить на чёрное и белое).
Сейчас тема переросла в состояние, близкое к спору без аргументов. Тем более, прошу учесть, что сама дискуссия ведётся вокруг очень сложного, национального вопроса. Даже дипломаты стараются обходить такую тематику, поскольку очень сложно не задеть национальные чувства сторон, участвующих в обсуждении.
Поэтому - я закрываю тему, но не из-за цензуры, а просто по причинам, изложенным мною выше. Надеюсь на понимание.
В первом листинге - да, названия должны быть обратными. Всё дерево и так выбирается одним запросом. Но если нужно именно строить его где-либо для рекурсивных процедур, то - как я уже и указал выше - либо начинать с листьев, либо хранить/вычислять уровни. Второе мне кажется наилучшим вариантом.
При этом я всё ещё рекомендую форматирование поручать приложению, так как это именно его работа. Выбрать через СУБД - можно, однако пользы в этом почти что нет. Тем более, что при двойной индексации выбранного дерева в приложении операции будут происходить очень быстро (так как мы используем хеш-выборки)
SELECT*FROM closure_table WHERE parent=X GROUPBY parent HAVING COUNT(1)=1
- Выбрать узлы, которые будут иметь в родителях X, а в качестве потомков - найденные листья. Это будет запрос на WHERE IN .. - что хорошо выполнится через range scan. Найденные узлы нужно рассортировать по листьям, поскольку нужно строить дерево и просто уровня уже недостаточно. Это, скорее всего, будет поручено приложению.
- Повторить до тех пор, пока есть записи.
В общем-то, запросов будет не так и много, но всё же запрос не будет один (несмотря на то, что всё дерево можно получить одним запросом).
Альтернатива - которой я бы рекомендовал пользоваться - выбрать всё дерево, а затем отдельно, в приложении, разбирать его. Это, конечно, потребует правильного построения массива, но все же это не так сложно. Этим можно воспользоваться, если размер данных не слишком велик.
Так как построение дерева "с листьев" - в общем-то, не очень простая задача, то можно хранить длину пути, чтобы получить возможность строить дерево с корня.
Ниже приведу пример, как можно поступить в случае с приложением. Вообще говоря, нам вовсе не обязательно хранить уровень - его можно вычислить (однако, как правило, лучше хранить и пересчитывать, так как вычисляется он исходя из количества записей в child-поле для конкретного узла). В примере я так и поступлю - то есть, не буду хранить уровень отдельно. Предположим, у нас есть дерево:
- я записываю его напрямую, но ничто не мешает выбирать данные из БД. Тогда в приложении мы можем рекурсивно собрать данные в привычную структуру со смежными подчинёнными узлами. Для этого нужно построить индекс-таблицу, в которой будет считаться как уровень узла, так и храниться его связи с остальными. В моём примере индекс двунаправленный (родители -> потомки, потомки->родители):
-выношу это отдельно, так как понимание структуры этой вспомогательной индекс-таблицы очень важно. По сути, работая с индексированной таблицей в СУБД будет выполняться примерно та же работа. Использовать это можно так:
- то есть, проверить, не лист ли передан, и, если нет, пройтись по поддереву рекурсивно. Поддерево - это все подчинённые узлы, у которых уровень на +1 больше. На этом всё.
Я рад, что Ваши сомнения в отношении меня рассеялись.
В отношении Вас - сомнений никогда и не было. В отношении обстоятельств - возможно, и были.
teddy пишет:
ООП как раз таки есть там и не мало
Нет. Знание структуры классов или, например, областей видимости/ключевых слов и их применения - это не ООП. Но это уже - достаточно близко к содержимому ZCE, так что не буду развивать эту тему.
Нет. Я ошибся. Мои данные - устарели. ZCE 5.5 действительно не включает в себя вопросы, которые я озвучил. И действительно по большей части это - знание страниц мануала и правильных способов применения тех или иных конструкций. Это включает в себя новые возможности 5.4 и 5.5, но не включает концептуальных и фундаментальных вопросов наподобие паттернов, ООП, хороших/плохих практик и их производных или же программирования в целом, абстрагируясь от PHP. Относительно Энтони - возникло недопонимание, поэтому стоит исключить его из данного вопроса (наверное, не очень правильно было на него ссылаться, однако же - я не хотел быть голословным)
Кроме того, Pearson Vue - это авторизованный центр для проведения тестов по сертификации Zend. Эти мои сомнения были не обоснованы (хотя и исходили из сильного противоречия, возникшего у меня, которое я и описал выше - а, так как я действительно не сомневался в Ваших усилиях, выходом было лишь - подвергнуть сомнению центр тестирования). И - существует только один сертификат Zend.
Поэтому - поздравляю с успешной сдачей (хотя, поздравить стоило в любом случае) и получением статуса ZCE.
Взаимоисключающие фразы. То Вы намекаете на то, что верите моим словам, то говорите, что есть сомнения. Вы уж определитесь.
Нет. Я всего лишь хотел бы увидеть сертификат (чтобы, в случае чего - мог его показать соавтору и убедиться - что - да, это тот самый сертификат. И - да, я понимаю, что сию минуту его ещё нет). Я допускаю, что соавтор экзамена мог многократно ошибиться при сдаче - однако факт есть факт - мои сведения отличаются от Ваших. То есть, мои сведения - экзамен по 5.5 настолько сложен и обширен, что даже те, кто причастен к его созданию - не имеют гарантии успешного прохождения. Он включает в себя не только эмпирические знания из страниц руководства или общеизвестные примеры. То есть, насколько мне известно, ZCE 5.5 нельзя просто "выучить" перед экзаменом.
Мне так же известно, что экзамен затрагивает концепции архитектуры и применения некоторых сложных вещей (например, асинхронность в ко-роутинах). Поэтому я всего лишь хочу уточнить. Если моя информация неверна - будет что спросить у человека (вернее, даже нескольких), причастного к созданию экзамена и разработке PHP в целом - о том, что в действительности представляет собой экзамен. Если он и вправду прост (и неудача соавтора была редкой случайностью) - то я пересмотрю приоритеты и отодвину его на второй план.
teddy пишет:
Нет желания быть инструментом для Ваших "поддевок".
Видимо, я был неверно понят. Однако прошу понять и меня. С одной стороны - человек из разряда Энтони Феррара (ссылки удалены для исключения индексирования), который сейчас работает в google. Быть справедливым - это человек, который стоит в авангарде разработки PHP и даже разрабатывает новые концепты разработки в одном ряду с ООП. Ну - честно, мне трудно поверить, что он так сильно "ошибся". С другой стороны - Ваша активность на конференции. Я не хочу умалять Ваших успехов, но у того человека мне есть чему поучиться - и, даже сказать больше, мне до него очень далеко.
Может быть, я зря опираюсь на мнение третьей стороны. Но - увидим (если, конечно, Ваш предыдущий комментарий не означал полное нежелание вести дальнейший диалог). Да, кстати - если я и усомнился - то в центре тестирования, но не в Вас. Я уверен, что Вы готовились и потратили время на этот экзамен.
Поэтому - не ставя под сомнение Ваши успехи - я всего лишь хочу всё выяснить. Возможно, речь идёт вообще о разных сертификациях? Тогда я уточню это у Энтони (Anthony Ferrara) и всё встанет на свои места. Ещё раз прошу прошения, если моё предыдущее сообщение выглядело оскорбительным или провокационным. Надеюсь, что никто из посетителей конференции не обвинит меня в подобных вещах - но, в свою очередь, тоже не хочу быть в позиции оправдывающегося. Это важно для меня - и я хочу всё обстоятельно изучить и понять.
Занятно. Видимо, ZCE - разные. Хотелось бы увидеть Ваш сертификат. Не подумайте, что это из недоверия, но просто - человек, с которым я знаком - и написавший ~30% вопросов к ZCE 5.5 - его не сдал. Отсюда возникают сомнения, прежде всего, в центре тестирования.
Я тоже не планирую идти на сертификацию 5.5, так как нужны весьма обширные практические познания. Не хотелось бы думать на плохое - поэтому мне правда интересно увидеть сертификат (он унифицирован, так что будет чем поддеть одного из авторов ZCE, если всё "в порядке")
Т.е. грубо говоря есть какой-то временный файл с проделанными операциями, по которому сервер сверяется7
Это не файл по смыслу (но физически всё есть файл) - это данные, находящиеся в файлах тех инструметов СУБД, которые отвечают за контроль целостности транзакций.
"Среднее средних" - верно не во всех случаях
Если взять (A1 + A2 + ... + An) / n и затем среднее для первого члена и оставшейся суммы:
смысл транзакции либо все выполняется либо ничего. Но для выполнения серверу требуется время. Если во время транзакции вырубается питание сервера, а он допустим делал миллион insert-ов, и вот на полумиллионом вырубилось питание. Как я понимаю из теории транзакции, транзакции не прошла, но что станет с первыми insert-оми при включении сервера?
Зависит от того, как реализован storage-engine. Незавершённые транзакции, как правило, откатываются до того момента, когда данные находились в целостном состоянии (на начало транзакции). Для этого могут использоваться сегменты отката или прочие инструменты внутри СУБД. Впрочем, ничто не надёжно на 100%. и в случае повреждения этих инструментов контроля - данные будут повреждены безвозвратно.
Нет. Скорость будет ровно такой же, как для обычного индекса. Отличие лишь в запрете дублей.
Надобность в индексе зависит от того, для чего Вы храните данные. Если просто ради самого хранения (то есто поиска не планируется) - индекс не нужен и даже вреден (поскольку замедляет вставки)