Создание уникальных имен папок, интересное решение для MySQL
Предо мной встала довольно стандартная и распространенная задача, но захотелось творчески подойти к её решению. Хочу поделиться с вами своими наработками и надеюсь вы предложите своё интересное решение.
Задача:
У нас есть некий веб-проект, работающий на PHP + MySQL. Есть сущность, наименование которой должно быть уникальным. Причем уникальность должна создаваться по алгоритму, как создаются папки в windows: New folder, New folder (2), New folder (3), и т.д., только у нас должны создаваться в формате MyFolder_xx (MyFolder_2, MyFolder_3, …).
Итак, хочу cоздать папку с именем MyFolder.
В голову сразу приходит простейший алгоритм: к количеству всех папок, начало которых “MyFolder”, прибавляем 1 и создаем нашу папку MyFolder_{count()+1}. Но что если мы создали 5 папок, а потом удалили 4ю. То при следующем создании у нас появится ещё одна папка MyFolder_5.
Есть ещё один вариант: начать по порядку проверять есть ли у нас папка MyFolder, потом MyFolder_2 и как появится свободное имя, присвоить его нашей папке. Но получится не очень красивое решение — берем все папки “MyFolder_xx” из базы, затем в PHP, пробегаясь по массиву, формируем новое имя.
Я же хочу предложить следующее решение: пусть база сразу нам вернет максимальный порядковый номер папок “MyFolder_xx”, используя его, присвоим папке уникальное имя.
Вот что получилось:
public function getUniqueName($name) { $sql = "select CONVERT(REPLACE(folderName,'" . $name . "_',''), signed) as i from myTable where folderName like '" . $name . "%' order by i desc limit 1"; $resultDb = $db->fetchOne($sql); $newName = $name; if ($resultDb) { $newName .= '_' . ($resultDb['i'] ? $resultDb['i'] + 1 : 2); } return $newName; }