Понятно... тогда получается, что я этот абзац не так понял.
да, мутновато там было написано, я надеюсь, что переписал начало второй статьи на более понятный вариант.
насчет корневой записи с PARENT = ID. Допустим, можно создать ОДНУ такую запись, где ID = 0 и PARENT = 0. Но тогда запросом
select * from objects where parent = 0 мы вытащим не только все корневые элементы, но и эту "центральную" запись. Тогда придется добавить
select * from objects where parent = 0 and id > 0, но в этом случае "зацепится" индекс по первичному ключу. Совсем решить эту проблему можно разве что запросом
select * from objects where parent = 0 and id+0 > 0
тогда "обобщенный" запрос для вытаскивания любого уровня дерева будет
select * from objects where parent = :param and id+0 > 0
почему, по Вашему мнению, не желательно использовать Parent не NOT NULL?
я очень сильно не люблю код, который "первые" элементы выбирает по одному условию, а остальные - по другому. В поправленном варианте статьи я это указал (where parent is null и where parent = :param). Отсюда и нелюбовь к null. Не упоминая, конечно, факт, что null нужно использовать только осознанно и по реальной необходимости, понимая 3-значную логику целиком и полностью.
кстати, лениво мне проверять, но что-то я не уверен, что запись с parent = 0 и id = 0 добавится в пустую таблицу с FK parent->id....