1) При использовании UISortable индексы не будут повторяться, если сериализовать массив элементов. Инструмент для этого у виджета есть.
2) Когда создаете новый элемент, первым этапом проверяете правильность пришедших данных, затем выдергиваете максимальный индекс из базы с учетом текущей ветки, если это дерево, потом добавляете в базу с этим индексом + 1. Запрос будет выглядеть примерно так:
SELECT MAX(`position`) FROM `my_table` WHERE `parent_id`=@current_parent -- @current_parent это ид текущего родителя. Если для хранения используется adjacency list, например.
Собственно и все.