Создание уникальных имен папок, интересное решение для MySQL

16 октября 2011 г.

Предо мной встала довольно стандартная и распространенная задача, но захотелось творчески подойти к её решению. Хочу поделиться с вами своими наработками и надеюсь вы предложите своё интересное решение.

Задача:

У нас есть некий веб-проект, работающий на 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;
}
Теги:
рубрика PHP